将Json反序列化为C#Collection

时间:2017-07-12 20:27:40

标签: c# json json.net

我想将json反序列化为C#对象的集合,但是会出现以下错误:

  

{"无法将当前JSON对象(例如{\" name \":\" value \"})反序列化为类型&System;系统。 Collections.Generic.List`1因为类型需要JSON数组(例如[1,2,3])才能正确反序列化。\ r \ n要修复此错误要么将JSON更改为JSON数组(例如[1,2, 3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是像数组或列表那样的集合类型),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。\ r \ n路由'组织',第1行,第17位。"}

代码:

 var jSon = "{\"Houses\":[{\"id\":\"123\",\"doorNumber\":22},
                          {\"id\":\"456\",\"deniNumber\":99}
            ]}";
        var temp = JsonConvert.DeserializeObject<List<House>>(jSon);
    }


public class House
{
    public int Id { get; set; }

    public int DoorNumber { get; set; }
}

1 个答案:

答案 0 :(得分:4)

您展示的JSON是一个Object,其中包含一个名为Houses的属性,其中包含您的数组。请注意外部Json如何被{ }包围而不是[ ],这就是您看到错误的原因。如果要反序列化为House列表,则只需选择该属性的值。你可以使用JObject,然后专门选择Houses属性。

var jobj = JObject.Parse(jSon);
var houses = JsonConvert.DeserializeObject<List<House>>(jobj["Houses"].ToString());

或者你可以这样做:

var houses = JObject.Parse(jSon)["Houses"].ToObject<List<House>>();

如果您希望能够在不使用JObject的情况下一步映射它,则必须使用另一个类来包装您的House列表并直接映射到您显示的JSON。

public class HouseList
{
    public List<House> Houses {get; set;}
}

鉴于此对象,你可以做到

var houses = JsonConvert.DeserializeObject<HouseList>(jSon).Houses;