使用 json.net 解析嵌套的 JSON



我在json反序列化方面有问题,下面是我的json

{
    "_id" : ObjectId("56bc28c436b252c406a67f17"),
    "empname": "dhiraj",
    "empcode": "123a",
    "level": {
        "levelID": 3,
        "levelDescription": "manager",
        "levelCode": "mg"
    },
    "Address": [
        {
            "Home": {
                "streetname": "Home",
                "city": "bbb",
                "state": "aaa"
            }
        },
        {
            "Office": {
                "streetname": "ofc",
                "city": "ccc",
                "state": "ddd"
            }
        }
    ]
}

对于上面的 json,对象类就像

public class Employee
{
    public ObjectId _id { get; private set; }
    public string empname { get; set; }
    public string empcode { get; set; }
    public List<Level> level { get; set; }
    public List<Address> Address { get; set; }
}
public class level
{
    public string levelID { get; set; }
    public string levelDescription { get; set; }
    public string levelCode { get; set; }
}
public class Address
{
    public List<Home> Home { get; set; }
    public List<office> Office { get; set; }
}
public class Home
{
    public string streetname { get; set; }
    public string city { get; set; }
    public string state { get; set; }
}
public class office
{
    public string streetname { get; set; }
    public string city { get; set; }
    public string state { get; set; }
}

我试图使用以下代码反序列化它

Employee empobj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Employee>>(jsonData);

但出现错误

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

我该如何解决它?有什么办法,json 结果来自 mongodb c# 查询。

这里有几个问题:

  • 提供的代码将无法编译,因为您指定了一个名为 level 的类,但将其用作Level
  • 您正在尝试反序列化List<Employee>,但您的 JSON 仅指定单个Employee对象;这与包含单个对象的对象数组不同
  • 您的 JSON 无效 - ObjectId("56bc28c436b252c406a67f17") JSON 中的值根本不是有效值。可能是 Json.NET 对这种奇怪现象有一些支持,但如果您可以使用有效的 JSON 会更好
  • 您的 Address 类为 Home 属性指定一个List<Home>,同样为 Office 属性指定一个 ,但同样,JSON 只指定一个对象值,而不是一个数组。level属性也是如此。

此外,您有单独的类用于HomeOffice的事实非常令人讨厌,命名约定的混合也是如此。地址的 JSON 结构远非理想,但我想您无法解决这个问题。

我无法真正解决ObjectId问题,但我会将类结构为:

public class Employee
{
    [JsonProperty("_id")]
    public ObjectId Id { get; private set; }
    [JsonProperty("empname")]
    public string Name { get; set; }
    [JsonProperty("empcode")]
    public string Code { get; set; }
    [JsonProperty("level")]
    public Level Level { get; set; }
    [JsonProperty("Address")]
    public List<Address> Addresses { get; set; }
}
public class Level
{
    [JsonProperty("levelID")]
    public string Id { get; set; }
    [JsonProperty("levelDescription")]
    public string Description { get; set; }
    [JsonProperty("levelCode")]
    public string Code { get; set; }
}
// This structure is unfortunate, but imposed by the JSON
public class Address
{
    [JsonProperty("Home")]
    public StreetAddress Home { get; set; }
    [JsonProperty("Office")]
    public StreetAddress Office { get; set; }
}
public class StreetAddress
{
    [JsonProperty("streetname")]
    public string StreetName { get; set; }
    [JsonProperty("city")]
    public string City { get; set; }
    [JsonProperty("state")]
    public string State { get; set; }
}

除了 ObjectId 之外,这将使用以下方法解析您给出的 JSON:

var employee = JsonConvert.DeserializeObject<Employee>(json);

相关内容

  • 没有找到相关文章

最新更新