c# - 科学计数法中的 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 = JsonConvert.DeserializeObject<TestClass>(json);
}

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

更新:感谢所有的回答,因为由于其他原因,将类型更改为 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));
    }
}

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

关于c# - 科学计数法中的 JSON.NET 整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36155389/

相关文章:

c# - 将我自己的非法字符插入 C# 中的 Path.GetInvalidFileNameChars()

c# - DataGridView.HitTestInfo 等同于 Infragistics.Win.UltraWinGrid.UltraGrid?

c# - 从子文件夹链接 dll

c# - 批量插入未保存到数据库

c# - Json.Net - 从 'ScopeId' 上的 'System.Net.IPAddress' 获取值时出错

c# - Json空数组在MVC中反序列化为null

C#序列化到文件,如果存在则覆盖

c# - 通过 .net 应用程序将报告文件上传到报告管理器?

.net - Realm for Xamarin 中的简单迁移

c# - 如何反序列化此 JSON?