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 或双精度由于其他原因是不可能的,但转换器类已经完成了这项工作

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

首先也是最简单的方法是将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,但你必须改变类并编写一个自定义转换器,这可能会使事情过于复杂。

您需要将string反序列化为等效Int64 -

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

您可以将值序列化为 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();
}

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

相关内容

  • 没有找到相关文章

最新更新