以下是我要转换为IDictionary
的序列化JSON数组
[
{
"8475": 25532
},
{
"243": 521
},
{
"3778": 15891
},
{
"3733": 15713
}
]
当我尝试使用时
JsonConvert.DeserializeObject<IDictionary<string, object>>((string)jarray);
我得到一个错误说:
无法将"jarray"(其实际类型为"Newtonsoft.Json.Linq.jarray")强制转换为"string"
JSON反序列化程序只需要一个字符串。
如果您已经有了JArray
,那么您所要做的就是将它转换为字典。
大致如下:
IDictionary<string,object> dict = jarray.ToDictionary(k=>((JObject)k).Properties().First().Name, v=> v.Values().First().Value<object>());
通过示例检查完整代码
不过,我认为可能有更好的方法将其转换为词典。我会继续找的。
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);
}
}
要将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