所以如果我在两个对象之间有一对多关系,我只能以一种方式序列化,否则在使用 Json.NET 时会出现循环错误。
我想以两种方式序列化对象,以便我可以上下导航对象。
阅读 Json.NET 的文档,我发现了通过添加以属性名称为后缀的 shouldSerialize 方法来有条件地序列化 C# poco 属性的能力。
参加经理和员工课程。一个经理有很多员工。我希望员工反向引用经理,但我只希望经理在经理不是员工的财产时引用员工。
{
manager: {
managerId: 1,
attr1: 'blah',
employees: [
{
employeeId:1,
manager: {
manager id: 1,
attr1: 'blah',
employees: **null**
}
]
}
这可能做到吗?最好的方法是什么?
这种方式使用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" }
。