json - JQ:Bigint 数字精度
问题描述
实际上,我遇到了一种情况,即在 jq 1.5/1.6(在 Windows 环境中)中遇到 BIGINT 问题和模糊性。我阅读了问题报告并认为如果我将数字转换为字符串,我可以处理它。但我用一个特定的命令测试它,结果是一样的
[. | { last_update: .starbase_detailed_scan.last_update_time, user_name: .starbase_detailed_scan.owner_name, alliance_id: .starbase_detailed_scan.owner_alliance_id | tostring, drydocks: .starbase_detailed_scan.num_drydocks, tier: .starbase_detailed_scan.owner_level, defence_plattform: .starbase_detailed_scan.num_defence_platforms, shield_triggered: .starbase_detailed_scan.player_shield.triggered_on, shield_end: .starbase_detailed_scan.player_shield.expiry_time, parsteel: .starbase_detailed_scan.resources["2325683920"], tritanium: .starbase_detailed_scan.resources["743985951"], dilithium: .starbase_detailed_scan.resources["2614028847"], user_id: .starbase_detailed_scan.owner_user_id, defence_rating: .starbase_detailed_scan.defense_rating }]
结果:
[{"last_update":"2018-12-23T19:26:24","user_name":"Hamita40","alliance_id":"774615702811599900","drydocks":3,"tier":19,"defence_plattform":3,"shield_triggered":"0001-01-01T00:00:00","shield_end":"0001-01-01T00:00:00","parsteel":183649,"tritanium":22459,"dilithium":7074,"user_id":"a2588903decc455283c88508f6a7fedf","defence_rating":25200}]
Alliance_id
是不正确的。正确的身份证是:
774615702811599864
有什么解决方法吗?
BR蒂莫
解决方案
使用tostring
不会有帮助,因为只有在 jq 解析器读取输入之后tostring
才能看到数字。
jq 维护者很清楚这个问题,确实有一个“拉取请求”可以解决这个问题: https ://github.com/stedolan/jq/pull/1752
如果您希望使用官方发布的 jq 版本,那么唯一可用的“解决方法”是将 JSON 源中的数字更改为字符串。您可能希望使用“bigint”库来处理“bigint”字符串 - https://github.com/joelpurra/jq-bigint
更新
截至 2019 年 10 月 22 日,“master”的 jq 版本保留了读取数字的精度,并且tostring
可以在不损失精度的情况下用于此类数字,例如
$ jq tostring
123456789123456789123456789123456789123456789123456789
"123456789123456789123456789123456789123456789123456789"
推荐阅读
- elasticsearch - '总字段限制超过 1000 个 Elasticsearch 异常
- c# - UPDATE 时的 NULL 条目
- javascript - javascript 和 jsquery 只能从控制台工作
- javascript - 使用 Redux 更改 setTimeout 在 React 中不起作用
- vue.js - 为 Laravel sanctum 获取 401 未授权
- python-3.x - OCC 模块 ImportError:DLL 加载失败:找不到指定的模块
- time-complexity - 为什么 TLE 用于散列而不是线性搜索
- reactjs - 使用布局渲染组件
- python - 运行 for 循环并将项目附加到 Python 中的空列表时的问题
- javascript - Jquery 使复选框选中其他复选框删除