【发布时间】:2020-07-27 00:59:41
【问题描述】:
我有一个简单的关系模型,其父子关系如下:
public class Parent
{
public Parent(int id)
{
Id = id;
}
public int Id { get; private set; }
public IList<Child> Children { get; set; } = new List<Child>();
}
public class Child
{
public Parent Parent { get; set; }
}
我创建了一个小对象图,其中包含共享同一父级的两个子级的列表:
var parent = new Parent(1);
var child1 = new Child {Parent = parent};
var child2 = new Child {Parent = parent};
parent.Children.Add(child1);
parent.Children.Add(child2);
var data = new List<Child> {child1, child2};
接下来,我使用SerializeObject对其进行序列化:
var settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.All
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data, Formatting.Indented, settings);
据我所知,生成的 json 看起来不错:
{
"$id": "1",
"$values": [
{
"$id": "2",
"Parent": {
"$id": "3",
"Id": 1,
"Children": {
"$id": "4",
"$values": [
{
"$ref": "2"
},
{
"$id": "5",
"Parent": {
"$ref": "3"
}
}
]
}
}
},
{
"$ref": "5"
}
]
}
但是,当我反序列化 json 时,我没有得到预期的对象,因为对于第二个孩子,Parent 属性为空,导致第二个断言失败:
var data2 = Newtonsoft.Json.JsonConvert.DeserializeObject<IList<Child>>(json, settings);
Debug.Assert(data2[0].Parent != null);
Debug.Assert(data2[1].Parent != null);
没有Parent的构造函数不会出现这个问题,第二个孩子的Parent属性有预期值。
有什么想法吗?
【问题讨论】:
-
是不是因为你只在序列化上设置 PreserveReferencesHandling 而不是在反序列化上,所以它不知道如何读取 $refs?
-
请分享生成的准确 JSON。另外,你读过newtonsoft.com/json/help/html/PreserveObjectReferences.htm 吗?
-
我更新了代码以在反序列化时也使用 PreserveReferencesHandling。但是,这没有任何效果我还包括了生成的 JSON
标签: c# json asp.net-core json.net