Десериализовать научную нотацию до длинного с помощью 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; }
}
Другие вопросы по тегам