使用Newtonsoft JSON处理循环引用

时间:2016-03-08 14:14:46

标签: c# json serialization json.net

我的模型类如下所示:

public class ModelType
{
    public string Name { get; set; }
    public ModelType SuperType { get; set }
    public IEnumerable<ModelType> SubTypes { get; set; }
}

我正在尝试序列化对象,但获取StackOverflowException。我试过打电话

JsonConvert.SerializeObject(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

以及

JsonConvert.SerializeObject(model, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });

这两个来电都是StackOverflowException。知道如何序列化ModelType实例吗?

修改

无法序列化的实例示例:

{
    Name: "Child",
    SuperType: {
        Name: "Parent",
        SuperType: null,
        SubTypes: [{
                Name: "Child",
                SuperType: {
                    Name: "Parent",
                    SuperType: null,
                    SubTypes: [{Name: "Child", ...}]
                },
                SubTypes: []
        }]
    },
    SubTypes: []
}

EDIT2

通过进一步调查问题(根据所有SO Q&amp; A,设置ReferenceLoopHandling.IgnorePreserveReferencesHandling.Objects应该有效)我发现了

  1. Child是唯一对象实例
  2. Child.SuperType(Parent)是唯一对象实例
  3. Child.SuperType.SubTypes [0](Child)是唯一的对象实例,不是对(1。)的引用。
  4. Child.SuperType.SubTypes [0] .SuperType(Parent)是唯一对象实例,不是对(2。)的引用。
  5. 依旧......
  6. 我认为,在对象创建过程中出现问题(我的代码之外),这创建了无限的对象链。我不确定这是否可以仅由JsonSerializerSettings处理。

1 个答案:

答案 0 :(得分:4)

Newtonsoft.Json可以拥有以下配置

 JsonSerializerSettings sets = new JsonSerializerSettings
    {
        PreserveReferencesHandling = PreserveReferencesHandling.Objects
    };

    var ser = JsonSerializer.Create(sets);

你可能想这样做。