【问题标题】:How to convert the following JSON array into IDictionary<string, object>?如何将以下 JSON 数组转换为 IDictionary<string, object>?
【发布时间】:2020-05-21 06:43:50
【问题描述】:

以下是我要转换为IDictionary的序列化JSON数组

[
  {
    "8475": 25532
  },
  {
    "243": 521
  },
  {
    "3778": 15891
  },
  {
    "3733": 15713
  }
]

当我尝试使用时

JsonConvert.DeserializeObject<IDictionary<string, object>>((string)jarray);

我收到一条错误消息:

无法将“jarray”(实际类型为“Newtonsoft.Json.Linq.JArray”)转换为“字符串”

JSON 反序列化器只需要一个字符串。

【问题讨论】:

  • 括号中的数组?这是有效的 JSON 吗?
  • 如果您已经有一个JArray 实例,那么为什么要转换为字符串以转换回某些JSON.NET 类型以转换为IDictionary? (而且您不能反序列化为接口,它必须是具体类型。)
  • 如果你真的想要一个字符串,为什么不在 jarray 上调用 ToString() 方法?
  • 您的 JSON 字符串无效。 JSONLint
  • 马里奥,当我尝试以下操作时,JsonConvert.DeserializeObject>(jarray.ToString());我收到消息 - 附加信息:无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“System.Collections.Generic.IDictionary`2[System.String,System.Object]”,因为该类型需要JSON 对象(例如 {"name":"value"})正确反序列化。

标签: c# json json.net


【解决方案1】:

如果你已经有了JArray,你所要做的就是把它转换成字典。

大概是这样的:

IDictionary<string,object> dict = jarray.ToDictionary(k=>((JObject)k).Properties().First().Name, v=> v.Values().First().Value<object>());

Check this for complete code with an example

我认为可能有更好的方法将其转换为字典。我会继续寻找。

【讨论】:

    【解决方案2】:

    JsonConvert.DeserializeObject&lt;T&gt; 方法采用 JSON 字符串,即 序列化 对象。
    你有一个反序列化的对象,所以你必须先序列化它,这实际上是没有意义的,考虑到你在JArray 对象中拥有你需要的所有信息。如果您的目标只是从数组中获取对象作为键值对,您可以执行以下操作:

    Dictionary<string, object> myDictionary = new Dictionary<string, object>();
    
    foreach (JObject content in jarray.Children<JObject>())
    {
        foreach (JProperty prop in content.Properties())
        {
            myDictionary.Add(prop.Name, prop.Value);
        }
    }
    

    【讨论】:

      【解决方案3】:

      要将您的JArray 转换为字符串,您需要为每个元素分配字典的键和值。马里奥给出了一个非常准确的方法。但是,只要您知道如何将每个项目转换为您想要的类型,就有一种更漂亮的方法。以下示例适用于Dictionary&lt;string, string&gt;,但可以应用于任何Value 类型。

      //Dictionary<string, string>
      var dict = jArray.First() //First() is only necessary if embedded in a json object
                       .Cast<JProperty>()
                       .ToDictionary(item => item.Name,
                                     item => item.Value.ToString()); //can be modified for your desired type
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-10
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-04
        • 1970-01-01
        相关资源
        最近更新 更多