1

我有带有科学计数法数字的 JSON,例如1.83E+2. 用 Json.NET 将它反序列化为 along对我来说效果很好,但是当我用 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; }
}
4

2 回答 2

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);
    }
}
于 2019-11-12T14:45:21.343 回答
1

System.Text.Json.JsonSerializer不支持将科学记数法转换为long. 反而。您需要序列化doubledecimal处理该数字:

public class Foo
{
    public double Bar { get; set; }
}
于 2019-11-12T13:00:58.163 回答