在c#中将Json映射反序列化为List

时间:2017-06-13 14:32:53

标签: c# json

我需要转换这种类型的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);

3 个答案:

答案 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;
            });
        });