C# 科学符号中的JSON.NET整数

C# 科学符号中的JSON.NET整数,c#,.net,json.net,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

另一个系统向我们提供了一些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);
}
公共类TestClass
{
公共int值{get;set;}
}
静态void Main(字符串[]参数)
{
var json=“{Value:9.658055e+06}”;
var xx=JsonConvert.DeserializeObject(json);
}
有没有办法让库正确地反序列化


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

您需要将
字符串
反序列化为
Int64
等效项-

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

您可以将值序列化为
double
,并访问与序列化隐藏的另一个属性等价的
int
(以保持json不变):

公共类TestClass
{
公共双重价值
{
获取{return(double)IntValue;}
设置{u IntValue=(int)value;}
}
私有整数_IntValue;
[JsonIgnore]
公共int值{
获取{return\u IntValue;}
设置{u IntValue=value;}
}
}
静态void Main(字符串[]参数)
{
var json=“{Value:9.658055e+06}”;
var xx=JsonConvert.DeserializeObject(json);
WriteLine(JsonConvert.SerializeObject(xx));
Console.WriteLine(xx.IntValue);
Console.ReadKey();
}

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

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

首先也是最简单的方法是将
属性的类型更改为
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));
    }
}
公共类TestClass
{
[JsonConverter(类型(JsonScientificConverter))]
公共int值{get;set;}
}
静态void Main(字符串[]参数)
{
var json=“{Value:9.658055e+06}”;
var xx=JsonConvert.DeserializeObject(json);
}
公共类JsonScientificConverter:JsonConverter
{
公共重写bool CanRead{get{return true;}}
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
serializer.Serialize(writer,value);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
返回(int)(序列化程序.反序列化(读取器));
}
}

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

将其反序列化为Double,然后将其转换为integer。
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));
    }
}