如何让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无法正确执行。

如何让JSON.NET在序列化期间呈现前向引用

发生的事情是,您正在Person变量中实例化一个Person变量。所以当你创建"儿子"时:

class Person
{
    public string Name { get; set; }
    public Person Mother { get; set; }
}

您正在内部创建一个Mother变量,它是一个Person类型的变量,具有常规Person变量所具有的所有属性,以及您正在获得的JSON文件。

相反,您可以尝试创建一个新的类"Mother",该类继承自类"Person",并且只有ID属性,因此当您创建JSON文件时,您将获得预期的结果。