【问题标题】:Deserialize Json into C# Collection将 Json 反序列化为 C# 集合
【发布时间】:2017-07-12 20:27:39
【问题描述】:

我想将 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\nPath '组织,第 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; }
}

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

    您展示的 JSON 是一个对象,其属性名为 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 的情况下一步映射它,则必须有另一个类来包装您的房屋列表并直接映射到您显示的 JSON。

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

    有了这个对象,你就可以做到

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

    【讨论】:

    • 太棒了。非常感谢。只要让我这样做,我就会将其标记为答案。谢谢
    • np,很高兴它有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多