Files
zszq-trs/Framework/YLErp.Core/Serialization/CustomDoubleConvert.cs
T
2024-05-09 14:06:26 +08:00

73 lines
2.2 KiB
C#

using System.Text.Json;
using System.Text.Json.Serialization;
namespace YLErp.Serialization
{
/// <summary>
///
/// </summary>
public class CustomDoubleConvert : JsonConverter<double>
{
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<TStruct> : JsonConverter<TStruct?> where TStruct : struct
//{
// public override TStruct? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
// {
// if (reader.TokenType == JsonTokenType.Null)
// return null;
// return JsonSerializer.Deserialize<TStruct>(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);
// }
//}
}