3

所以如果我两个对象之间是一对多的关系,我只能用一种方式序列化,否则在使用Json.NET时会出现循环错误。

我想以两种方式序列化对象,所以我可以上下导航对象。

阅读 Json.NET 的文档后,我发现能够通过添加以属性名称为后缀的 shouldSerialize 方法来有条件地序列化 C# poco 属性。

参加经理和员工课程。一位经理有许多员工。我希望员工反向引用经理,但我只希望经理在经理不是员工的财产时引用员工。

{ 
  manager: {
   managerId: 1,
   attr1: 'blah',

   employees: [
    {
     employeeId:1,
     manager: {
      manager id: 1,
      attr1: 'blah',
      employees: **null**
     }
   ]
}

这可能吗?最好的方法是什么?

4

1 回答 1

2

如果您使用ShouldSerialize这种方式,那么您的反向引用将不会是反向引用。Employee.Manager将指向一个不同 Manager的,而不是在其Employees属性中包含员工的那个。

您应该改用JsonSerializerSettings.PreserveReferencesHandling它,它专门设计用于使交叉链接成为可能并避免对象重复。

class Program
{
    private static void Main ()
    {
        var m = new Manager { Attr = "Attr1" };
        var e = new Employee { Attr = "Attr1", Manager = m };
        m.Employees = new[] { e };
        Console.WriteLine(JsonConvert.SerializeObject(m,
            new JsonSerializerSettings {
                PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                Formatting = Formatting.Indented,
            }));
        Console.ReadKey();
    }
}

class Manager
{
    public Employee[] Employees;
    public string Attr;
}

class Employee
{
    public Manager Manager;
    public string Attr;
}

此代码将输出以下 JSON:

{
  "$id": "1",
  "Employees": [
    {
      "$id": "2",
      "Manager": {
        "$ref": "1"
      },
      "Attr": "Attr1"
    }
  ],
  "Attr": "Attr1"
}

请注意,所有对象现在都具有$id属性,并且当对象第二次出现在对象图中时,将插入对它的引用而不是对象:{ "$ref": "1" }

于 2013-08-30T11:55:07.673 回答