如何将以下JSON数组转换为IDictionary <string,object =“”>?</string,>

时间:2014-09-24 12:41:23

标签: c# json json.net

以下是我要转换为IDictionary

的序列化JSON数组
[
  {
    "8475": 25532
  },
  {
    "243": 521
  },
  {
    "3778": 15891
  },
  {
    "3733": 15713
  }
]

当我尝试使用

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

我收到错误说:

  

无法施放&#39; jarray&#39; (其实际类型为&#39; Newtonsoft.Json.Linq.JArray&#39;)至&#39;字符串&#39;

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

3 个答案:

答案 0 :(得分:7)

如果您已经拥有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

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

答案 1 :(得分:1)

JsonConvert.DeserializeObject<T>方法采用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);
    }
}

答案 2 :(得分:0)

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