ASP.NETCore会将属性转换为基类
创始人
2024-09-17 21:01:09
0

这个问题可能会在使用自定义JSON序列化器时出现,因为ASP.NET Core默认使用System.Text.Json进行JSON序列化和反序列化,而它不支持循环引用。因此,可能需要使用Newtonsoft.Json作为替代方案。

如果必须使用System.Text.Json,可以使用以下代码解决此问题:

首先,定义一个自定义的JsonConverter类,用于处理循环引用属性,并将其注册到JsonSerializerOptions对象中。

public class SelfReferencingJsonConverter : JsonConverter
{
    private readonly JsonSerializerOptions _serializerOptions;

    public SelfReferencingJsonConverter(JsonSerializerOptions serializerOptions)
    {
        _serializerOptions = serializerOptions;
    }

    public override bool CanConvert(Type typeToConvert)
    {
        return !typeToConvert.IsPrimitive && typeToConvert != typeof(string);
    }

    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Null)
        {
            return null;
        }

        if (reader.TokenType == JsonTokenType.StartObject)
        {
            using JsonDocument document = JsonDocument.ParseValue(ref reader);
            return JsonSerializer.Deserialize(document.RootElement.GetRawText(), typeToConvert, _serializerOptions);
        }

        if (reader.TokenType == JsonTokenType.StartArray)
        {
            var array = new List();

            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.EndArray)
                {
                    return array;
                }

                array.Add(Read(ref reader, typeToConvert, options));
            }

            return array.ToArray();
        }

        return JsonSerializer.Deserialize(ref reader, typeToConvert, options);
    }

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        if (value == null)
        {
            writer.WriteNullValue();
            return;
        }

        if (options.ReferenceHandler != null && options.ReferenceHandler.CanReference(value))
        {
            writer.WriteStartObject();
            writer.WritePropertyName("$ref");
            writer.WriteStringValue(options.ReferenceHandler.GetReference(value, false));
            writer.WriteEndObject();
            return;
        }

        if (
                
            
            
            

相关内容

热门资讯

一分钟揭秘!aapoker如何... 一分钟揭秘!aapoker如何设置胜率,德普之星透视辅助插件,本来是真的有挂(有挂细节);1、下载好...
近日!aa poker辅助,德... 近日!aa poker辅助,德扑之星私人局辅助免费,本来真的有挂(有挂细节)1、德扑之星私人局辅助免...
一直以来!hhpoker作弊实... 一直以来!hhpoker作弊实战视频,智星德州辅助译码插件靠谱吗,一直确实有挂(有挂总结)运智星德州...
重大发现!wepokerplu... 重大发现!wepokerplus到底是挂了吗,德州透视hhpoker,果然有挂(有挂方略)1、有没有...
据相关数据显示!wepoker... 据相关数据显示!wepoker私人定制透视,智星德州有脚本吗,一贯是真的有挂(有挂实锤)一、智星德州...
科普攻略!wepoker插件程... 科普攻略!wepoker插件程序激活码,hhpoker一直输有挂吗,其实有挂(新版有挂)1、进入到w...
有了最新消息!wepoker怎... 有了最新消息!wepoker怎么增加运气,如何下载德普之星辅助软件,本来确实有挂(有挂辅助)1、进入...
必备辅助推荐!we poker... 必备辅助推荐!we poker插件,wepoker永久免费脚本,原来是真的有挂(有挂分析)辅助器是一...
据统计!wepoker怎么设置... 据统计!wepoker怎么设置透视,德普之星透视辅助插件,本来是真的有挂(有挂透视)1.德普之星透视...
传递经验!德普之星有辅助软件吗... 传递经验!德普之星有辅助软件吗,wepoker辅助器安装包定制,真是是真的有挂(竟然有挂)1、wep...