我需要转换这种类型的json
{
"italy":[
{
"city":"rome",
"people":100000
},
{
"city":"milan",
"people":50000
}
],
"spain":[
{
"city":"barcelona",
"people":100000
},
{
"city":"madrid",
"people":2000
}
]
}
进入此c#类的列表
class CityPeople
{
public string City { get; set; }
public string Country { get; set; }
public int People { get; set; }
}
所以,在这种特殊情况下,我希望有一个由4个条目组成的列表,2个用于意大利,2个用于西班牙。
如何将json反序列化为此类?
我试图像这样做一个sandard反序列化,但没有成功,因为json不是jsonarray
List<CityPeople> citiesPeople = JsonConvert.DeserializeObject<List<CityPeople>>(myJson);
答案 0 :(得分:4)
最简单的方法往往是最好的方法。
为什么不在项目中添加一个类来表示json的确切内容:
public class CityInfo
{
public string City { get; set; }
public int People { get; set; }
}
然后您可以反序列化为Dictionary<string, CityInfo[]>
并构建您的CityPeople
对象,如下所示:
List<CityPeople> cityPeople = new List<CityPeople>();
foreach(var f in JsonConvert.DeserializeObject<Dictionary<string, CityInfo[]>>(json))
{
foreach(var i in f.Value)
{
cityPeople.Add(new CityPeople() {
City = i.City,
Country = f.Key,
People = i.People
});
}
}
工作小提琴here
答案 1 :(得分:1)
我解决了对Dictionary<string,CityPeople>
进行反序列化,然后将字典转换为在转换过程中更新城市的列表。
答案 2 :(得分:1)
另一种方法:
var obj = JsonConvert.DeserializeObject<JObject>(jsonText);
IEnumerable<CityPeople> cityPeople = obj.Cast<KeyValuePair<string, JToken>>().SelectMany(kvp =>
{
return kvp.Value.ToObject<List<CityPeople>>().Select(c =>
{
c.Country = kvp.Key;
return c;
});
});