-
Notifications
You must be signed in to change notification settings - Fork 111
处理重复引用
陈鑫伟 edited this page May 20, 2019
·
4 revisions
public class Demo
{
public int HashCode => GetHashCode();
public object Parent { get; set; }
public object Me => this;
public object Child { get; set; }
public static void Main()
{
var obj = new Demo();
var chi = new Demo();
obj.Child = chi;
chi.Parent = obj;
// 处理方式一:将循环引用的对象设为 Null。
var jsonFormatter = new JsonFormatter(JsonFormatterOptions.LoopReferencingNull | JsonFormatterOptions.Indented);
Console.WriteLine(jsonFormatter.Serialize(obj));
/*
* {
* "Child": {
* "Child": null,
* "HashCode": 30015890,
* "Me": null,
* "Parent": null
* },
* "HashCode": 55530882,
* "Me": null,
* "Parent": null
* }
**/
// 配合忽略 Null 使用将会忽略循环引用的字段。
jsonFormatter.Options |= JsonFormatterOptions.IgnoreNull;
Console.WriteLine(jsonFormatter.Serialize(obj));
/*
* {
* "Child": {
* "HashCode": 30015890,
* },
* "HashCode": 55530882
* }
**/
// 处理方式二:将重复引用以 $ref 形式序列化。
// 此方式符合 Json 格式,但不是 Json 标准。
// 许多 Json 编辑工具都承认 $ref 格式,如 VS。
// 注意:此方式可能无法在浏览器中处理。
jsonFormatter = new JsonFormatter(JsonFormatterOptions.MultiReferencingReference | JsonFormatterOptions.Indented);
Console.WriteLine(jsonFormatter.Serialize(obj));
/*
* {
* "Child": {
* "Child": null,
* "HashCode": 30015890,
* "Me": { "$ref": "#/Child" },
* "Parent": { "$ref": "#" }
* },
* "HashCode": 55530882,
* "Me": { "$ref": "#" },
* "Parent": null
* }
**/
// 处理方式三:设置最大结构深度。
jsonFormatter = new JsonFormatter(JsonFormatterOptions.Indented | JsonFormatterOptions.IgnoreNull);
jsonFormatter.MaxDepth = 2;
Console.WriteLine(jsonFormatter.Serialize(obj));
/*
* {
* "Child": {
* "HashCode": 30015890,
* "Me": {
* },
* "Parent": {
* }
* },
* "HashCode": 55530882,
* "Me": {
* "Child": {
* },
* "HashCode": 55530882,
* "Me": {
* }
* }
* }
**/
// 处理方式四:抛出异常
jsonFormatter = new JsonFormatter(JsonFormatterOptions.LoopReferencingException);
Console.WriteLine(jsonFormatter.Serialize(obj));
// JsonLoopReferencingException: Json serializating members '#/Child' and '#/Child/Me' loop referencing.
}
}