Json.Net 将复杂的查询字符串转换为 JsonString

Posted

技术标签:

【中文标题】Json.Net 将复杂的查询字符串转换为 JsonString【英文标题】:Json.Net convert complex querystring to JsonString 【发布时间】:2015-09-17 17:49:35 【问题描述】:

我正在实现一个实用方法来将 queryString 转换为 JsonString。

我的代码如下:

        public static string GetJsonStringFromQueryString(string queryString)
        
            var nvs = HttpUtility.ParseQueryString(queryString);
            var dict = nvs.AllKeys.ToDictionary(k => k, k => nvs[k]);
            return JsonConvert.SerializeObject(dict, new KeyValuePairConverter());
        

当我使用以下代码进行测试时:

 var postString = "product[description]=GreatStuff" +
                    "&product[extra_info]=Extra"; 
 string json = JsonHelper<Product>.GetJsonStringFromQueryString(postString);

我明白了


    "product[description]":"GreatStuff",
    "product[extra_info]":"Extra",

      ...

   

我想得到的是


    "product":
       "description": "GreatStuff",
       "extra_info" : "Extra",
       ...
    

如何在不使用 System.Web.Script Assembly 的情况下实现这一目标? (我在 Xamarin 上,无法访问该库)

【问题讨论】:

如果您查询的字符串看起来像这样,您必须编写自己的 C# 逻辑来解析它们。 var postString = "product[description]=GreatStuff" + "&product[extra_info]=Extra" + "&product[ledger_account_id]=42" + "&product[sales_price]=11.5" + "&product[sales_price_includes_tax]=0" + "&product [tax_code_id]=33"; 看到这个***.com/questions/15872658/… 【参考方案1】:

您需要删除product[key](产品属性名称或密钥...除外)部分才能得到您想要的...

也就是说,您应该在以这种方式解析查询字符串之前对其进行预处理:

string queryString = "product[description]=GreatStuff" +
        "&product[extra_info]=Extra";
var queryStringCollection = HttpUtility.ParseQueryString(queryString);
var cleanQueryStringDictionary = queryStringCollection.AllKeys
                                    .ToDictionary
                                    (
                                        key => key.Replace("product[", string.Empty).Replace("]", string.Empty),
                                        key => queryStringCollection[key]
                                    );

var holder = new  product = cleanQueryStringDictionary ;
string jsonText = JsonConvert.SerializeObject(holder);

【讨论】:

这适用于单层嵌套对象。如果我有类似 product[vender][address][street_line1] = "8 hanson street" 的东西。有没有通用的解决方案? @WeiMa AFAIK,没有。归根结底,您的查询字符串有点奇怪....您正在创建类似 OData 或谁知道的东西 :( 我的意思是,您需要自定义从查询字符串到 JSON 的序列化。显然您可以开发一些基本的解析器甚至涵盖从查询字符串到 json 的递归转换............ @WeiMa 我可以在这里放一个自制的解决方案......但遗憾的是我需要吃晚饭和睡觉;P顺便说一句,你最终可以得到一个解析每个级别的通用解决方案[key1][keyN] 并像我在回答中所做的那样,但递归地,你知道...... 是的,我明白了。评估是否值得努力创建递归解决方案。谢谢你的回答。

以上是关于Json.Net 将复杂的查询字符串转换为 JsonString的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 json.net 将数据表转换为 json 字符串?

使用json.net实现复杂对象转换为QueryString

json.net将string数据转换为List<>报错

json.net将string数据转换为List<>报错

Json.NET 可以对流进行序列化/反序列化吗?

将 json 转换为 C# 数组?