0

我是 dotnet 的新手,正在尝试 dotnet 6 最小 API。我有两个模型:

namespace Linker.Models
{
    class Link : BaseEntity
    {
        [MaxLength(2048)]
        public string Url { get; set;} = default!;
        [MaxLength(65536)]
        public string? Description { get; set; }
        [Required]
        public User Owner { get; set; } = default!;
        [Required]
        public Space Space { get; set; } = default!;
    }
}

和:

namespace Linker.Models
{
    class Space : BaseEntity
    {
        public string Name { get; set; } = default!;
        public string Code { get; set; } = default!;
        public User Owner { get; set; } = default!;
        public List<Link> Links { get; set; } = new List<Link>();
    }
}

现在,当我尝试序列化Space模型时,我得到了错误System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 64.(有意义,因为Path: $.Links.Space.Links.Space.Links.Space.Links.Space.Links.Space.Links...)。是否可以防止 dotnet 将对象序列化这么深?我什至不需要 dotnet 来尝试序列化这么深的关系

4

1 回答 1

1

您可以ReferenceHandler.PreserveJsonSerializerOptions. 这些文档 如何在 System.Text.Json 中保留引用以及处理或忽略循环引用进一步讨论。

对于手动序列化/反序列化,将选项传递给JsonSerializer

JsonSerializerOptions options = new()
{
    ReferenceHandler = ReferenceHandler.Preserve
};
string serialized = JsonSerializer.Serialize(model, options);

或者在最小 API 中全局配置:

using Microsoft.AspNetCore.Http.Json;

var builder = WebApplication.CreateBuilder(args);

// Set the JSON serializer options
builder.Services.Configure<JsonOptions>(options =>
{
    options.SerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
});

您可以改为忽略循环引用,而不是使用ReferenceHandler.IgnoreCycles. 序列化程序会将循环引用设置为null,因此使用此方法可能会丢失数据。

于 2022-02-27T12:58:21.930 回答