Десериализовать научную нотацию до длинного с помощью System.Text.Json
У меня есть JSON с числом в научной записи, например 1.83E+2
. Десериализация с помощью Json.NET вlong
у меня хорошо сработал, но когда я заменяю десериализатор новым в System.Text.Json, он выдает JsonException
:
System.Text.Json.JsonException: 'Значение JSON не может быть преобразовано в System.Int64. ...'
Вот воспроизводимый пример:
static void Main()
{
// test1 is 183
var test1 = Newtonsoft.Json.JsonConvert.DeserializeObject<Foo>(@"{""Bar"": 1.83E+2}");
// throws JsonException
var test2 = System.Text.Json.JsonSerializer.Deserialize<Foo>(@"{""Bar"": 1.83E+2}");
}
public class Foo
{
public long Bar { get; set; }
}
2 ответа
Решение
Спросив у команды.NET Core, они предложили следующее решение проблемы:
static void Main()
{
var options = new JsonSerializerOptions
{
Converters = { new CustomInt64Converter() }
};
// test1 is 183
var test1 = Newtonsoft.Json.JsonConvert.DeserializeObject<Foo>(@"{""Bar"": 1.83E+2}");
// test2 is 183
var test2 = System.Text.Json.JsonSerializer.Deserialize<Foo>(@"{""Bar"": 1.83E+2}", options);
}
public class Foo
{
public long Bar { get; set; }
}
public class CustomInt64Converter : JsonConverter<long>
{
public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return reader.TryGetInt64(out var result) ? result : Convert.ToInt64(reader.GetDecimal());
}
public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
{
writer.WriteNumberValue(value);
}
}
System.Text.Json.JsonSerializer
не поддерживает преобразование научных обозначений в long
. Вместо. вам нужно сериализовать вdouble
или decimal
и обработайте это число вместо этого:
public class Foo
{
public double Bar { get; set; }
}