using System.Text.Json; using System.Text.Json.Serialization; namespace YLErp.Serialization { /// /// /// public class CustomDoubleConvert : JsonConverter { public override double Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String || reader.TokenType == JsonTokenType.Null) { var str = reader.GetString(); if (string.IsNullOrWhiteSpace(str) || str.Trim() == "null" || str == "NaN") { return 0d; } if (double.TryParse(str, out var d)) { return d; } } return reader.GetDouble(); } public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOptions options) { if (double.IsNaN(value)) { writer.WriteStringValue("NaN"); } else if (double.IsInfinity(value)) { writer.WriteNullValue(); } else { writer.WriteNumberValue(value); } } public static readonly CustomDoubleConvert Default; static CustomDoubleConvert() { Default = new CustomDoubleConvert(); } } //https://github.com/dotnet/runtime/issues/30843 //public class NullableStructSerializer : JsonConverter where TStruct : struct //{ // public override TStruct? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) // { // if (reader.TokenType == JsonTokenType.Null) // return null; // return JsonSerializer.Deserialize(ref reader, options); // } // public override void Write(Utf8JsonWriter writer, TStruct? value, JsonSerializerOptions options) // { // if (value == null) // writer.WriteNullValue(); // else // JsonSerializer.Serialize(writer, value.Value, options); // } //} }