我们从另一个系统获得了一些 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 是不可能的,但转换器类已经完成了这项工作
有两种方法可以做到这一点:
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,但你必须更改类并编写一个自定义转换器,这可能会使事情变得过于复杂。
| 归档时间: |
|
| 查看次数: |
3118 次 |
| 最近记录: |