为了帮助其他可能遇到此问题或类似问题的人...
在我的情况下,我有一个包含其他对象数组的对象,这些子对象中的一个引用类型属性在反序列化后始终为空。我尝试了各种方法,包括下载JSON.Net源代码并逐步查找故障点。
长话短说,问题当然是我的问题。以下是我的JSON和类的高度简化版本。
JSON
{
"$id": "1",
"RowCount": 10,
"Rows": [{
"$id": 2",
"ItemId": "1",
"ItemName": "Some Item",
"Owner": {
"Name": "John Doe",
"Id": "711D04F5-586F-4FD4-8369-4C00B51DD86F",
// other properties...
},
"OwnerId": "711D04F5-586F-4FD4-8369-4C00B51DD86F"
},
// more rows
]
}
类别
public class Items
{
public int RowCount { get; set; }
public IEnumerable<Item> Rows { get; set; }
}
public class Item
{
private string ownerId;
public string ItemId { get; set; }
public string ItemName { get; set; }
public Person Owner { get; set; }
public string OwnerId
{
get { return this.ownerId; }
set {
if (value != this.ownerId)
{
this.Owner = null;
}
this.ownerId = value;
}
}
}
public class Person
{
public string Name { get; set; }
public string Id { get; set; }
}
由于在 JSON 中,
Owner
属性出现在
OwnerId
属性之前,所以当设置
OwnerId
属性时,setter 代码确定当前值与要设置的值不同(因为当前值为 null),因此将
Owner
属性设置为 null。
为解决该问题,我还检查将要设置的值与
Owner
对象的 id 是否相同,如果相同则跳过将
Owner
设置为 null 的步骤。
诚然,我的问题的原因可能并非对于每个人都是相同的,但这至少是一个提醒:在反序列化期间初始化对象时,请仔细检查发生了什么情况。