.net core 内置的 System.Text.Json 序列化类型扩展支持

添加以扩展:

public class TextJsonConverExtension
    {
        public static void AddConverters(Microsoft.AspNetCore.Mvc.JsonOptions configure)
        {
            //添加支持string转int的操作
            configure.JsonSerializerOptions.Converters.Add(new IntToStringConverter());
            configure.JsonSerializerOptions.Converters.Add(new StringToStringConverter());
            configure.JsonSerializerOptions.Converters.Add(new LongToStringConverter());
            
        }
    }
    public class IntToStringConverter : JsonConverter<Int32>
    {
        public override Int32 Read(ref System.Text.Json.Utf8JsonReader reader, Type type, System.Text.Json.JsonSerializerOptions options)
        {
            if (reader.TokenType == System.Text.Json.JsonTokenType.String)
            {
                ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
                if (System.Buffers.Text.Utf8Parser.TryParse(span, out Int32 number, out int bytesConsumed) && span.Length == bytesConsumed)
                    return number;

                if (Int32.TryParse(reader.GetString(), out number))
                    return number;
            }
            return reader.GetInt32();
        }

        public override void Write(Utf8JsonWriter writer, Int32 value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString());
        }
    }
    public class StringToStringConverter : JsonConverter<String>
    {
        public override String Read(ref System.Text.Json.Utf8JsonReader reader, Type type, System.Text.Json.JsonSerializerOptions options)
        {
           
            if (reader.TokenType == System.Text.Json.JsonTokenType.String)
            {
                return reader.GetString();
            }
            else if(reader.TokenType == System.Text.Json.JsonTokenType.Number)
            {
                ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
                if (System.Buffers.Text.Utf8Parser.TryParse(span, out Int32 number, out int bytesConsumed) && span.Length == bytesConsumed)
                        return number.ToString();

                if (Int32.TryParse(reader.GetString(), out number))
                        return number.ToString();
            }
            return null; 

            //return reader.GetInt32();
        }

        public override void Write(Utf8JsonWriter writer, String value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString());
        }
    }
        public class LongToStringConverter : JsonConverter<long>
        {   
            public override long Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
            {        
                if (reader.TokenType == JsonTokenType.String)
                {           
                  ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;            if (Utf8Parser.TryParse(span, out long number, out int bytesConsumed) && span.Length == bytesConsumed)                return number;            if (Int64.TryParse(reader.GetString(), out number))                return number;
                }        
                return reader.GetInt64();
            }    
            public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
            {        
                writer.WriteStringValue(value.ToString());
            }
        }


使用:

 services.AddMvc(options =>
            {
            }).AddJsonOptions(options =>
            {
                //添加json的扩展
                TextJsonConverExtension.AddConverters(options);
                //解决中文自动编码
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            });

更多参考:https://github.com/dotnet/runtime/issues/30255



本文作者:admin

本文链接:https://www.javalc.com/post/86.html

版权声明:本篇文章于2021-12-30,由admin发表,转载请注明出处:分享你我。如有疑问,请联系我们

Office Online Server2016搭建与部署(在线编辑)

发表评论

取消
扫码支持