我在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
属性也是如此。
此外,您有单独的类用于Home
和Office
的事实非常令人讨厌,命名约定的混合也是如此。地址的 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);