首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用AutoMapper修复无限对象嵌套或设置最大深度级别?

如何使用AutoMapper修复无限对象嵌套或设置最大深度级别?
EN

Stack Overflow用户
提问于 2021-01-27 22:56:48
回答 1查看 154关注 0票数 0

我正在处理一个项目,其中我需要将一个特定对象的列表映射到另一个列表。您可以在下面找到这些对象。我需要将列表序列化为JSON字符串,但它抛出了下一个错误:

代码语言:javascript
运行
复制
System.Text.Json.JsonException: 'A possible object cycle was detected which is not supported. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.'

对象(剪切):

代码语言:javascript
运行
复制
    class Class1
    {
        public string Name { get; set; }
        public List<Product> Products { get; set; } = new List<Product>();
    }

    class Product
    {
        public string Name { get; set; }
        public Class1 Class1 { get; set; }
    }

    class Class1Model
    {
        public string Name { get; set; }
        public IEnumerable<Product> Products { get; set; }
    }

    class ProductModel
    {
        public string Name { get; set; }
        public Class1Model Class1 { get; set; }
    }

这是我的mapperprofile:

代码语言:javascript
运行
复制
public class MyMapper : Profile
{
    public MyMapper()
    {
        CreateMap<Class1, Class1Model>().MaxDepth(2);
        CreateMap<Product, ProductModel>().MaxDepth(2);
    }
}

调试时,我的映射列表显示了无限的嵌套对象。例如:

代码语言:javascript
运行
复制
Class1Model
   --> Products, each Product 
        --> Class1Model
            --> Products, each Product
                 --> Class1Model
                    --> repeating....

我的MapperProfile中的MaxDepth配置没有解决这个问题。我想要一个真正的最大深度,比如2,这样我的System.Text.Json.JsonSerializer就不会崩溃。我们故意不想使用NewtonSoft JSON。

EN

回答 1

Stack Overflow用户

发布于 2021-01-27 23:42:41

我将我的System.Text.Json升级到了v5.0.1。

我创建了一个JsonSerializerOptions对象:

代码语言:javascript
运行
复制
 var settings = new JsonSerializerOptions
 {
     ReferenceHandler = ReferenceHandler.Preserve
 };

序列化:

代码语言:javascript
运行
复制
var json = JsonSerializer.Serialize(class1s, options: settings);

将对象序列化为JSON字符串时,字符串是这样构建的:

代码语言:javascript
运行
复制
var deserializedJson = JsonSerializer.Deserialize<IEnumerable<Class1Model>>(json, options: settings);

{"$id":"1","$values":[{"$id":"2","Name":"t","Products":{"$id":"3","$values":[{"$id":"4","Name":"p","Class1":{"$id":"5","Name":"t","Products":{"$id":"6","$values":[{"$ref":"4"}]}}}]}}]}

不知何故,$id$values$ref标记记住了在将对象序列化为JSON字符串之前进行反序列化时,如何在其原始结构中构建对象。

这就是解决之道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65921686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档