如何让 jq 保留 bigint 值?

问题描述 投票:0回答:3

我有一个很大的 JSON 文件,其中包含带有完整值的 bigints——不像 JavaScript 默认喜欢做的那样四舍五入。 我们有一个解决方法来处理 Node.js 中的 bigints,但我正在尝试使用 jq(命令行工具)来清理我们的数据。 然而,当我在我们的 JSON 文件上运行 jq 时,它舍入了我们所有的 bigints。

有没有一种方法可以使用 jq,这样它就不会舍入 bigints,或者是否有另一个可以在 Mac 上运行的命令行工具我可以使用?

json integer jq bigint arbitrary-precision
3个回答
4
投票

截至目前,jq 提供的关于 JSON 数字的最佳版本是“master”版本,它可以很好地保留外部数值。更新是在 2019 年 10 月 22 日左右进行的,jq 的“主”版本似乎与最新版本(jq 1.6)一样安全。

使用最新“主”版本的示例:

    jqMaster -n -M '
    [0000,
     10000000000000000000000000000000000000012, 
     1.0000000000000000000000000000000000000012, 
     1000000000000000000000000000000000000001210000000000000000000000000000000000000012,
     0.1e123456]'

输出

[
  0,
  10000000000000000000000000000000000000012,
  1.0000000000000000000000000000000000000012,
  1000000000000000000000000000000000000001210000000000000000000000000000000000000012,
  1E+123455
]

2
投票

另一个选择是使用“gojq”,jq 的 Go 实现,它使用整数文字的无限精度表示。

事实上,除了在撰写本文时仅在 gojq 的“master”版本中修复的一个错误外,gojq 支持无限精度整数运算。错误修复:https://github.com/itchyny/gojq/commit/7a1840289029c9c038d61274ceac9b8d307c0358


0
投票

不是最优雅的解决方案,但应该允许您避免安装任何外部包/库的解决方案是在命令行中使用 Python 以下列方式解析 bigint:

JSON_DATA='{"id": 8532687839421703901}'
ID=$(echo "$JSON_DATA" | python3 -c 'import json,sys;obj=json.load(sys.stdin);print(obj["id"]);')
echo $ID

输出原始bigint值:

8532687839421703901

这里是 python 脚本,为了便于阅读,不在一行中:

import json
import sys


obj = json.load(sys.stdin)
print(obj["id"])
© www.soinside.com 2019 - 2024. All rights reserved.