73 lines
2.2 KiB
C#
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);
|
|
// }
|
|
//}
|
|
} |