我正在处理一个项目,其中我需要将一个特定对象的列表映射到另一个列表。您可以在下面找到这些对象。我需要将列表序列化为JSON字符串,但它抛出了下一个错误:
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.'
对象(剪切):
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:
public class MyMapper : Profile
{
public MyMapper()
{
CreateMap<Class1, Class1Model>().MaxDepth(2);
CreateMap<Product, ProductModel>().MaxDepth(2);
}
}
调试时,我的映射列表显示了无限的嵌套对象。例如:
Class1Model
--> Products, each Product
--> Class1Model
--> Products, each Product
--> Class1Model
--> repeating....
我的MapperProfile
中的MaxDepth
配置没有解决这个问题。我想要一个真正的最大深度,比如2,这样我的System.Text.Json.JsonSerializer
就不会崩溃。我们故意不想使用NewtonSoft JSON。
发布于 2021-01-27 23:42:41
我将我的System.Text.Json
升级到了v5.0.1。
我创建了一个JsonSerializerOptions对象:
var settings = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.Preserve
};
序列化:
var json = JsonSerializer.Serialize(class1s, options: settings);
将对象序列化为JSON字符串时,字符串是这样构建的:
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字符串之前进行反序列化时,如何在其原始结构中构建对象。
这就是解决之道。
https://stackoverflow.com/questions/65921686
复制相似问题