如何将json字符串序列化为表单发布数据

And*_* N. 4 c# json.net

我需要将JSON字符串POST到页面.该页面是外部的,不受我的控制,它希望帖子数据采用网络形式的帖子格式(key1=value1&key2=value2)

如何将JSON字符串转换为此格式?

Bri*_*ers 10

这可以通过首先将JSON反序列化为a Dictionary<string, string>,然后遍历字典中的键值对并从中构建查询字符串来完成.

但是,请记住,查询字符串格式(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

key1=value1&key2=value2&int=5&bool=True&decimal=3.14&punct=x%2by%3dz
Run Code Online (Sandbox Code Playgroud)

  • FormUrlEncodedContent方法可以将您的字典转换为表单字符串。整个foreach可以替换为:字符串urlencodedformdata = new FormUrlEncodedContent(dict); (2认同)