JSON.NET 科学记数法中的整数

Gre*_*mps 4 .net c# json.net

我们从另一个系统获得了一些 JSON,该系统认为以科学记数法表示整数会很有趣。按照目前的情况,JSON.NET 会抛出以下异常:

输入字符串 9.658055e+06 不是有效整数。

我已经能够使用一些简单的代码重新创建该问题:

public class TestClass
{
    public int Value { get; set; }
}

static void Main(string[] args)
{
    var json = "{Value:9.658055e+06}";

    var xx = JsonConvert.DeserializeObject<TestClass>(json);
}
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以让库正确反序列化它吗?

更新:感谢所有答案,由于其他原因,将类型更改为 Int64 或 double 是不可能的,但转换器类已经完成了这项工作

Ric*_*ons 5

有两种方法可以做到这一点:

Value首先也是最简单的是将您的财产类型更改为System.Int64. 这很可能“有效”。

但是,如果它确实需要是一个int,你可以这样做:

public class TestClass
{
    [JsonConverter(typeof(JsonScientificConverter))]
    public int Value { get; set; }
}

static void Main(string[] args)
{
    var json = "{Value:9.658055e+06}";

    var xx = JsonConvert.DeserializeObject<TestClass>(json);
}

public class JsonScientificConverter : JsonConverter
{
    public override bool CanRead { get { return true; } }
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return (int)(serializer.Deserialize<System.Int64>(reader));
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,您将其读取为 a System.Int64,然后将其转换为常规int. 所以你有一个int,但你必须更改类并编写一个自定义转换器,这可能会使事情变得过于复杂。