使用System.Text.Json将科学记法反序列化很长时间

时间:2019-11-12 12:54:23

标签: json .net-core 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 个答案:

答案 0 :(得分:1)

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

public class Foo
{
    public double Bar { get; set; }
}

答案 1 :(得分:1)

在询问.NET Core团队之后,他们提供了this solution的问题:

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);
    }
}