【问题标题】:Json.Net convert complex querystring to JsonStringJson.Net 将复杂的查询字符串转换为 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";

标签: c# json xamarin json.net


【解决方案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] 并像我在回答中所做的那样,但递归地,你知道......
  • 是的,我明白了。评估是否值得努力创建递归解决方案。谢谢你的回答。
猜你喜欢
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多