【问题标题】:TypeScript: serialize BigInt in JSONTypeScript:在 JSON 中序列化 BigInt
【发布时间】:2021-03-17 00:38:30
【问题描述】:

我正在寻找一种方法来强制JSON.stringify 始终打印BigInts 而不会抱怨。

我知道它是非标准的,我知道有一个纯 JavaScript 的包;但它不符合我的需要。我什至知道通过设置BigInt.prototype.toJSON 可以修复原始 JavaScript。我需要的是某种方式在我的 TypeScript 代码中全局覆盖普通的 JSON.stringify 函数。

大约一年前,我发现了以下代码:

declare global
{
    interface BigIntConstructor
    {
        toJSON:()=>BigInt;
    }
}

BigInt.toJSON = function() { return this.toString(); };

在某些网页上我无法再次找到。它曾经在我的另一个项目中工作,但它似乎不再工作了。我不知道为什么。

无论我对上面的行做什么,如果我尝试打印一个包含 BigInt 的 JSON,我会得到:TypeError: Do not know how to serialize a BigInt

任何帮助表示赞赏 - 非常感谢提前。

【问题讨论】:

  • 不应该是toJSON:()=>BigInttoJSON:(num: BigInt)=>string
  • 当我发现代码 sn-p 时问了自己同样的问题。那时它不起作用;它现在不起作用(这是我作为健全性检查测试的事情之一......)。这段代码 sn-p 仍然让我感到困惑。顺便说一句,我尝试了更多,我认为它不再起作用的原因可能与我的tsconfig.json有关;但我不确定我需要做什么才能让它再次工作;如果它甚至与我当前的“目标”需求兼容。

标签: json typescript global bigint


【解决方案1】:

您可以像这样为JSON.stringify 使用replacer 参数:

const obj = {
  foo: 'abc',
  bar: 781,
  qux: 9n
}

JSON.stringify(obj, (_, v) => typeof v === 'bigint' ? v.toString() : v)

【讨论】:

  • 有点罗嗦,但我喜欢它:它完成了工作;非常感谢!!
【解决方案2】:

这就是你要找的:

BigInt.prototype.toJSON = function() { return this.toString() }

https://github.com/GoogleChromeLabs/jsbi/issues/30#issuecomment-953187833

【讨论】:

  • 这适用于纯 JavaScript,但不适用于 TypeScript。使用 tsc 编译会出现错误 TS2339:“BigInt”类型上不存在属性“toJSON”。
【解决方案3】:

我需要让 JSON.stringify 在其中一个依赖项中工作,所以我不能使用上面的答案。相反,我创建了一个 patch.js 文件:

BigInt.prototype.toJSON = function() {
    return this.toString()
} 

然后在我的 TypeScript 源代码的开头添加:

require('patch.js')

之后,JSON.stringify 可以毫无问题地处理 BigInts。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 2021-09-07
    • 2022-09-23
    • 2022-01-06
    • 2020-10-13
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多