我需要将JSON字符串POST到页面。该页面是外部的,超出了我的控制范围,它希望帖子数据采用web表单帖子格式(key1=value1&key2=value2
)
如何将JSON字符串转换为这种格式?
这可以通过首先将JSON反序列化为Dictionary<string, string>
,然后遍历字典中的键值对并从中构建查询字符串来实现。
但是,请记住,querystring格式(application/x-www-form-urlencoded
)不是分层格式,而JSON是。因此,JSON对象只能是一个具有键值对的简单对象(没有数组或嵌套对象)。如果您的JSON比这更复杂,那么在将其转换为查询字符串之前,您将不得不做更多的工作来对其进行扁平化。
演示:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""key1"" : ""value1"",
""key2"" : ""value2"",
""int"" : 5,
""bool"" : true,
""decimal"" : 3.14,
""punct"" : ""x+y=z""
}";
var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> kvp in dict)
{
if (!string.IsNullOrEmpty(kvp.Key) && !string.IsNullOrEmpty(kvp.Value))
{
if (sb.Length > 0) sb.Append('&');
sb.Append(HttpUtility.UrlEncode(kvp.Key));
sb.Append('=');
sb.Append(HttpUtility.UrlEncode(kvp.Value));
}
}
var postDataString = sb.ToString();
Console.WriteLine(postDataString);
}
}
输出:
key1=value1&key2=value2&int=5&bool=True&decimal=3.14&punct=x%2by%3dz
正如在评论中提到的,您可以使用FormUrlEncodedContent
类来做同样的事情。用以下内容替换上面代码中的StringBuilder
和foreach
循环(但请注意,这种方法需要async/await
):
var formUrlEncodedContent = new FormUrlEncodedContent(dict);
var postDataString = await formUrlEncodedContent.ReadAsStringAsync();
您不会那样发布JSON。您将ContentType标头设置为"application/json",然后只需按原样用json填充内容主体。
C#或JSON.NET中没有内置的支持来将JSON序列化为表单后期数据,但假设JSON格式足够简单,您可能可以相对容易地使用LINQ to JSON自己编写翻译程序。
传入的Json总是一样的吗?最好的办法是将Json反序列化为C#类,然后从中创建post数据。