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

C# 如何将json字符串序列化为表单post数据,c#,json.net,C#,Json.net,我需要在页面上发布一个JSON字符串。 该页面是外部的,不在我的控制范围内,它希望post数据采用web表单post格式(key1=value1&key2=value2) 如何将JSON字符串转换为这种格式?您不会这样发布JSON。将内容类型头设置为“application/json”,然后只需按原样用json填充内容体 C#或JSON.NET中没有内置的支持来将JSON序列化为表单post数据,但是假设JSON格式足够简单,您可以相对轻松地使用LINQ to JSON编写一个翻译程序。传递的J

我需要在页面上发布一个JSON字符串。 该页面是外部的,不在我的控制范围内,它希望post数据采用web表单post格式(
key1=value1&key2=value2


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

您不会这样发布JSON。将内容类型头设置为“application/json”,然后只需按原样用json填充内容体


C#或JSON.NET中没有内置的支持来将JSON序列化为表单post数据,但是假设JSON格式足够简单,您可以相对轻松地使用LINQ to JSON编写一个翻译程序。

传递的JSON是否总是相同的?最好的方法是将Json反序列化为C类,然后从中创建post数据。

这可以通过首先将Json反序列化到
字典中,然后迭代字典中的键值对并从中构建查询字符串来完成

但是,请记住,querystring格式(
application/x-www-form-urlencoded
)不是层次结构格式,而JSON是层次结构格式。因此,JSON对象只能是具有键值对的简单对象(没有数组或嵌套对象)。如果JSON比这更复杂,那么在将其转换为querystring之前,您需要做更多的工作来将其展平

演示:


正如在评论中提到的,您可以使用这个类来做同样的事情。将上述代码中的
StringBuilder
foreach
循环替换为以下内容(但请注意,这种方法需要
async/await
):


如果您发布它,它将显示为一个普通的post字段——毕竟json只是文本。e、 g.
$data=json\u decode($\u POST['name\u of\u field\u you\u POST\u the\u json\u as'])
我很困惑。您想发布它,但使用GET格式作为示例。@MarcB不是PHP吗?如果页面只需要“application/x-www-form-urlencoded”格式怎么办?('key=value'对,由&@ArlaudAgbePierre分隔)这是HTML表单将数据发布到页面时的标准格式如果页面只需要'application/x-www-form-urlencoded'格式怎么办?('key=value'对,由&)好吧,我假设您可以将整个JSON字符串放在一个键中,但是老实说,如果页面不需要JSON,它无论如何也不会工作。您将JSON发布到需要JSON的页面。实际上,我的问题是如何将JSON字符串序列化为表单post数据。页面是一个外部资源,我无法控制它。我正在寻找框架中的方法。但是您的答案是最完整的。FormUrlEncodedContent方法可以将您的字典转换为格式字符串。整个foreach可以替换为:字符串urlencodedformdata=newformurlencodedcontent(dict);
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
var formUrlEncodedContent = new FormUrlEncodedContent(dict);
var postDataString = await formUrlEncodedContent.ReadAsStringAsync();