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
已经在咖啡走廊生产环境运行了一周、性能提升一倍左右。