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



我需要将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类来做同样的事情。用以下内容替换上面代码中的StringBuilderforeach循环(但请注意,这种方法需要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数据。

相关内容

  • 没有找到相关文章

最新更新