使用 Newtonsoft JSON 处理循环引用



我的模型类如下所示:

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: []
}

编辑2

通过进一步研究这个问题(根据所有SO问答,设置ReferenceLoopHandling.IgnorePreserveReferencesHandling.Objects应该有效),我发现

  1. 子对象是唯一的对象实例
  2. Child.SuperType (Parent) 是唯一的对象实例
  3. Child.SuperType.SubTypes[0] (Child) 是唯一的对象实例,而不是对 (1.) 的引用。
  4. Child.SuperType.SubTypes[0].超类型(父级)是唯一的对象实例,而不是对 (2.) 的引用。
  5. 等等...

我认为,在对象创建过程中出了点问题(在我的代码之外),这创建了无限的对象链。我不确定这是否可以通过JsonSerializerSettings来处理.

Newtonsoft.Json 可以有以下配置

 JsonSerializerSettings sets = new JsonSerializerSettings
    {
        PreserveReferencesHandling = PreserveReferencesHandling.Objects
    };
    var ser = JsonSerializer.Create(sets);

你可能想这样做。

相关内容

  • 没有找到相关文章

最新更新