【问题标题】:Deserialize scientific notation to long with System.Text.Json使用 System.Text.Json 将科学记数法反序列化为 long
【发布时间】:2019-11-26 08:03:31
【问题描述】:

我有带有科学计数法数字的 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; }
}

【问题讨论】:

    标签: json .net-core system.text.json


    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好的,谢谢。这有什么原因吗?开发人员讨论过这个吗?
      • 我不知道,你最好问问开发人员!
      猜你喜欢
      • 2021-07-04
      • 2020-06-23
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多