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

时间:2016-03-22 13:16:00

标签: c# .net 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);
}

我是如何让图书馆正确反序列化的?

更新:感谢所有答案,对于记录,将类型更改为Int64或由于其他原因无法实现双倍,但转换器类已完成此任务

3 个答案:

答案 0 :(得分:3)

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

首先也是最简单的方法是将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));
    }
}

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

答案 1 :(得分:0)

您需要将string反序列化为Int64当量 -

var parsed = JsonConvert.DeserializeObject<Int64>("9.658055e+06"); //9658055

答案 2 :(得分:0)

您可以将值序列化为double,并使用隐藏到序列化的另一个属性访问int等效项(以保持json相同):

public class TestClass
{
    public double Value
    {
        get { return (double)IntValue; }
        set { _IntValue = (int)value; }
    }

    private int _IntValue;
    [JsonIgnore]
    public int IntValue {
        get { return _IntValue; }
        set { _IntValue = value; }
    }

}

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

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

    Console.WriteLine(JsonConvert.SerializeObject(xx));
    Console.WriteLine(xx.IntValue); 
    Console.ReadKey();
}

如您所见,正确解析了值,当您重新序列化对象时,由于[JsonIgnore]属性上的IntValue属性,Json保持不变。