.net core3.1 System.Text.Json替换Newtonsoft.Json

Newtonsoft.Json的设置如下

        static JsonUtility()
        {
            JsonSerializerSettings setting = new JsonSerializerSettings();
            JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
            {
                setting.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
                setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                setting.ContractResolver = new CamelCasePropertyNamesContractResolver();
                //setting.Converters.Add(new LongJsonConverter());
                return setting;
            });
        }

  

.AddNewtonsoftJson(options =>
            {
            options.SerializerSettings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
            options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            options.SerializerSettings.Converters.Add(new LongJsonConverter());
        });
        }

System.Text.Json如下

 static JsonUtility()
        {
            options = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
                PropertyNameCaseInsensitive = true,
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };
            options.Converters.Add(new TextJsonConvert.DateTimeConverter());
            options.Converters.Add(new TextJsonConvert.DateTimeNullableConverter());
            options.Converters.Add(new TextJsonConvert.LongConverter());
            options.Converters.Add(new TextJsonConvert.Int32Converter());
            options.Converters.Add(new TextJsonConvert.DecimalConverter());
            options.Converters.Add(new TextJsonConvert.StringConverter());
        }
public static void AddApi(this IServiceCollection services)
        {
            if (services == null) throw new ArgumentNullException(nameof(services));
            services.AddControllers(options =>
            {
                options.Filters.Add<AsyncExceptionFilter>();
                options.Filters.Add<AsyncAuthorizationFilter>();

            }).AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
                options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
                options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
                options.JsonSerializerOptions.Converters.Add(new TextJsonConvert.DateTimeConverter());
                options.JsonSerializerOptions.Converters.Add(new TextJsonConvert.DateTimeNullableConverter());
                options.JsonSerializerOptions.Converters.Add(new TextJsonConvert.LongConverter());
                options.JsonSerializerOptions.Converters.Add(new TextJsonConvert.Int32Converter());
                options.JsonSerializerOptions.Converters.Add(new TextJsonConvert.DecimalConverter());
                options.JsonSerializerOptions.Converters.Add(new TextJsonConvert.StringConverter());
            });
          }
 public class TextJsonConvert
    {
        public class DateTimeConverter : System.Text.Json.Serialization.JsonConverter<DateTime>
        {
            public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            {
                return DateTime.Parse(reader.GetString());
            }

            public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
            {
                writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
            }
        }

        public class DateTimeNullableConverter : System.Text.Json.Serialization.JsonConverter<DateTime?>
        {
            public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            {
                return string.IsNullOrEmpty(reader.GetString()) ? default(DateTime?) : DateTime.Parse(reader.GetString());
            }

            public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
            {
                writer.WriteStringValue(value?.ToString("yyyy-MM-dd HH:mm:ss"));
            }
        }

        public class LongConverter : System.Text.Json.Serialization.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());
            }
        }

        public class Int32Converter : System.Text.Json.Serialization.JsonConverter<int>
        {
            public override int 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 int number, out int bytesConsumed) && span.Length == bytesConsumed)
                        return number;

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

                return reader.GetInt32();
            }

            public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
            {
                writer.WriteNumberValue(value);
            }
        }

        public class DecimalConverter : System.Text.Json.Serialization.JsonConverter<Decimal>
        {
            public override decimal 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 decimal number, out int bytesConsumed) && span.Length == bytesConsumed)
                        return number;

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

                return reader.GetDecimal();
            }

            public override void Write(Utf8JsonWriter writer, decimal value, JsonSerializerOptions options)
            {
                writer.WriteNumberValue(value);
            }
        }

        public class StringConverter : System.Text.Json.Serialization.JsonConverter<string>
        {
            public override string Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
            {
                if (reader.TokenType == JsonTokenType.Number)
                {
                    if (reader.TryGetInt32(out int number))
                        return number.ToString();
                    if (reader.TryGetInt64(out long longNumber))
                        return longNumber.ToString();
                }

                return reader.GetString();
            }

            public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
            {
                writer.WriteStringValue(value);
            }
        }
    }

主要效果就是CamelCase、不区分大小写、时间格式、long主键转string、string转int32和decimal、int32转string

已经在咖啡走廊生产环境运行了一周、性能提升一倍左右。

猜你喜欢

转载自www.cnblogs.com/xiatiandegaga/p/13164502.html