使用 Json.NET 读取大整数

2023-12-29

我有一些带有巨大整数的 json,大约有几百位数字。我想将它们解析为 BouncyCastle 的BigInteger (https://github.com/onovotny/BouncyCastle-PCL/blob/pcl/crypto/src/math/BigInteger.cs https://github.com/onovotny/BouncyCastle-PCL/blob/pcl/crypto/src/math/BigInteger.cs).

{
    "bigNumber":12093812947635091350945141034598534526723049126743245...
}

因此,我实现了一个转换器,在默认设置中使用合同解析器。

internal class BigIntegerConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue(value.ToString());
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken jToken = JToken.Load(reader);
        return new BigInteger(jToken.ToString());
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(BigInteger));
    }
}

public class BigIntegerContractResolver : DefaultContractResolver
{
    private static readonly JsonConverter bigIntegerConverter = new BigIntegerConverter();
    private static Type type = typeof(BigInteger);

    protected override JsonConverter ResolveContractConverter(Type objectType)
    {
        if (objectType == type)
        {
            return bigIntegerConverter;
        }
        return base.ResolveContractConverter(objectType);
    }
}

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            ContractResolver = new BigIntegerContractResolver()
        };

编写器按其应有的方式工作,写入一个(大)整数值,而不是类 BigInteger 及其所有属性等。但是,读取失败。 ReadJson 和 CanConvert 似乎都没有被调用。

我得到以下异常:

JsonReaderException:JSON整数340597435091750914358634185762341897561435984635897436598435643875643189576413589743659817456...对于Int64来说太大或太小。

如何让 Json.NET 将此数字解析为字符串而不是整数?

理想情况下,我不想先自己解析 json 字符串来添加引号。


如果您的大数字没有被引用,Json.Net 会将其反序列化为System.Numerics.BigInteger。这发生在JsonTextReader,早在转换器有机会处理它之前。所以如果你希望你的结果类型是Org.BouncyCastle.Math.BigInteger,你需要从System.Numerics.BigInteger。 (我知道,这似乎有点倒退。另一种选择是创建自己的JsonTextReader,但这可能会带来比其价值更多的麻烦 - 现有阅读器的大多数有用部分都在私有或内部方法中,因此子类化它是不切实际的。)

我能够让这个转换器工作:

class BigIntegerConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(Org.BouncyCastle.Math.BigInteger));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        System.Numerics.BigInteger big = (System.Numerics.BigInteger)reader.Value;
        return new Org.BouncyCastle.Math.BigInteger(big.ToString());
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue(value.ToString());
    }
}

这是我使用的测试程序。请注意,我没有使用解析器。JsonSerializerSettings has a Converters集合,所以我刚刚添加了BigIntegerConverter对此。

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""bigNumber"": 12093812947635091350945141034598534526723049126743245
        }";

        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            Converters = new List<JsonConverter> { new BigIntegerConverter() }
        };

        Foo foo = JsonConvert.DeserializeObject<Foo>(json);
        Console.WriteLine(foo.BigNumber.ToString());
    }
}

class Foo
{
    public Org.BouncyCastle.Math.BigInteger BigNumber { get; set; }
}

Output:

12093812947635091350945141034598534526723049126743245
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Json.NET 读取大整数 的相关文章

随机推荐

  • 为什么我无法在 Windows 10 上安装适用于 Python 的 rpy2?

    我正在尝试安装该软件包rpy2将 R 与 Python 结合使用 但是使用 pip install 安装失败 我在 Windows 10 上将 R 和 Python 与 Microsoft Visual Studio 2017 结合使用 安
  • 如何在 Azure 中设置 smtp 服务器

    是否可以在 Azure 中设置 Windows VM 来充当 smtp 服务器 我在某处读到它违反了 Azure 政策 是否有官方文档说明了这一点 This doc https learn microsoft com en us azure
  • 当 php 返回值更改时,使用 javascript 更新 html 代码

    我想使用 php 文件的返回来不断更新 html 文档 因此我需要使用 jQuery 函数 get returnfunction php function data test data document getElementById t1
  • python 3.4 多重处理不适用于unittest

    我有一个使用多处理的单元测试 从 Python 3 2 升级到 Python 3 4 后 出现以下错误 我找不到任何提示 Python 内部发生了什么变化以及我必须改变什么才能使我的代码运行 提前致谢 Traceback most rece
  • 如何使用 GDB 在 Emacs 中调试 R 包(带有 C 代码)?

    我目前正在编写一个 R 包并通过以下方式使用编译的 C 代码RcppR 中的包 对于像我这样的非程序员来说 Rcpp 使 R 和 C 代码的交互更容易 恕我直言 我想使用 gdb 调试 C 程序中的一些错误 我用 google 搜索了一下
  • 如何使用 VERTX 处理程序获取 POST 表单数据?

    我可以使用缓冲区处理程序获取表单数据 但它是一个 void 函数 我无法返回表单数据值 总共有大约 4 7 个表单 我不想最终一遍又一遍地编写相同的处理程序 因为默认函数是 void html a href activateUserPage
  • ASP.NET MVC 5 Identity 2.0、Windows Auth、具有角色属性的用户模型

    我正在尝试创建一个使用 Windows 身份验证但使用从用户模型中提取的角色的 MVC5 应用程序 我到处搜索示例 但我能找到的唯一示例是基于旧的 ASP NET 身份框架的 有人愿意指出我正确的方向吗 Thanks 所以我想出了一种方法来
  • 用户使用 Firebase Auth 和 Swift 验证其电子邮件后,如何重定向回我的应用?

    当用户在我的应用程序中注册时 他们会收到一个弹出窗口 显示 请验证您的电子邮件 然后登录 当用户单击 确定 时 他们将进入登录页面 此时 用户应转到邮件应用 iPhone 并单击从 Firebase 发送给他们的链接 单击此链接当前会打开
  • 从 NUnit 测试代码创建 iOS UI 组件

    我正在尝试为一些以编程方式创建 UIButtons 的代码编写单元测试 但是当我从测试中调用此代码时 我得到了NullReferenceException 在调试器中单步执行 看起来像UIButton FromType 返回空值 这是我正在
  • Corrgram 包装水平和垂直标签

    我正在尝试使用 Corrgram 包中的 labels 参数来绘制垂直轴和水平轴 但遇到了严重的困难 我尝试通过 labels 参数传递我的变量名称 但我的标签仍然在对角线上 我的代码如下 correlations lt c var1 va
  • 在没有模型的数据存储中查询

    我正在尝试在 appengine 中创建一个应用程序来搜索键列表 然后使用此列表从数据存储中删除这些记录 此服务必须是通用服务 因此我无法使用仅按名称搜索的模型当然 可以通过应用程序引擎功能来做到这一点吗 下面是我的代码 但它要求我有一个模
  • Add() 方法为 Code-First 实体框架中的链接模型添加重复行

    以下是将贷款请求添加到数据库的操作 HttpPost public ActionResult Add Models ViewModels Loans LoanEditorViewModel loanEditorViewModel if Mo
  • 如何在 PDO 准备语句中使用 LIKE 子句? [复制]

    这个问题在这里已经有答案了 我有一个这样的sql查询 SELECT FROM tbl name WHERE title Like needle 当我使用此语句手动查询 MySQL 数据库时 它起作用了 但是当我将它与 PDO 一起使用并使用
  • 在 Windows 上安装 git:Git Bash Here 或 git-cheetah shell 扩展?

    我正在 Windows XP 上安装 Git 在安装过程中 安装程序会询问我是否想要 1 上下文菜单条目 Git Bash Here 以及 Git GUI Here 选项 or 2 git cheetah shell 扩展 仅限 32 位
  • Pyspark:自定义窗口函数

    我目前正在尝试提取 PySpark 数据框中连续出现的一系列事件 并对它们进行排序 排名 如下所示 为了方便起见 我已通过以下方式对初始数据框进行了排序 user id and timestamp df ini user id timest
  • 移位是 O(1) 还是 O(n)?

    是否轮班操作O 1 or O n 计算机通常需要更多的操作来移动 31 位而不是移动 1 位 这是否有意义 或者说这是否有意义操作次数换档所需的是constant不管我们需要转移多少地方 PS 想知道是否hardware是一个合适的标签 某
  • 使用 AWS amplify 和 graphql 创建新用户时出现“未经授权”错误

    所以我认为这个问题来自于我不太理解 AWS cognito 用户池和 graphql 模式中的身份验证规则之间的关系 当我运行下面的代码时 我收到消息 未授权访问 User 类型上的 createUser import React from
  • 从模板中获取 Django 表单小部件的类型

    我正在迭代表单的字段 对于某些字段 我想要稍微不同的布局 需要更改 HTML 为了准确地做到这一点 我只需要知道小部件类型 它的类名或类似的名称 在标准 python 中 这很容易 field field widget class name
  • AS3中dispatchEvent()可以带参数吗?

    看这个例子 addEventListener myEventType myFunction argument function myFunction args String Function return function evt Even
  • 使用 Json.NET 读取大整数

    我有一些带有巨大整数的 json 大约有几百位数字 我想将它们解析为 BouncyCastle 的BigInteger https github com onovotny BouncyCastle PCL blob pcl crypto s