如何让JSON.NET在序列化期间呈现前向引用
本文关键字:引用 序列化 JSON NET | 更新日期: 2023-09-27 18:29:33
JSON.NET(使用设置PreserveReferencesHandling = PreserveReferencesHandling.Objects
)在第一次出现时以内联方式序列化重复出现的对象,并在后续出现时将其序列化为JSON引用。我猜这样做是为了避免转发引用。
例如:
class Person
{
public string Name { get; set; }
public Person Mother { get; set; }
}
var joni = new Person { Name = "Joni" };
var james = new Person { Name = "James", Mother = joni };
var people = new List<Person> { james, joni };
var json = JsonConvert.SerializeObject(people, Formatting.Indented,
new JsonSerializerSettings {
PreserveReferencesHandling = PreserveReferencesHandling.Objects });
结果如下:
[
{
"$id": "1",
"Name": "James",
"Mother": {
"$id": "2",
"Name": "Joni",
"Mother": null
}
},
{
"$ref": "2"
}
]
相反,我想得到这个:
[
{
"$id": "1",
"Name": "James",
"Mother": {
"$ref": "2"
}
},
{
"$id": "2",
"Name": "Joni",
"Mother": null
}
]
尽管两者实际上是相等的,但我发现第二种方法要明智得多,尤其是在手动编辑JSON数据时(这是我在这方面的一个用例)。
有没有一种方法可以控制哪个实例被序列化为引用,或者我是否被这种首次出现的行为所困扰?
编辑
我尝试过反序列化所需的JSON,发现由于前向引用,JSON.NET无法正确执行。
发生的事情是,您正在Person变量中实例化一个Person变量。所以当你创建"儿子"时:
class Person
{
public string Name { get; set; }
public Person Mother { get; set; }
}
您正在内部创建一个Mother变量,它是一个Person类型的变量,具有常规Person变量所具有的所有属性,以及您正在获得的JSON文件。
相反,您可以尝试创建一个新的类"Mother",该类继承自类"Person",并且只有ID属性,因此当您创建JSON文件时,您将获得预期的结果。