JQ: точность чисел Bigint - PullRequest
       16

JQ: точность чисел Bigint

0 голосов
/ 15 апреля 2019

На самом деле у меня возникла ситуация, когда я столкнулся с проблемой BIGINT и ее опасностью в jq 1.5 / 1.6 (в среде Windows). Я прочитал отчеты о проблеме и подумал, что если я преобразую число в строку, я справлюсь с этим. Но я проверяю его с помощью определенной команды, и результат тот же

[. | { 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 Timo

1 Ответ

1 голос
/ 15 апреля 2019

Использование tostring не поможет, потому что tostring может увидеть число только после , парсер jq прочитал ввод.

Сопровождающие jq хорошо знают об этой проблеме, и действительно есть «запрос на удаление», который решает ее: https://github.com/stedolan/jq/pull/1752

Если вы хотите использовать официально выпущенную версию jq, то единственным доступным «обходным путем» будет изменение числа в источнике JSON на строку. Вы можете использовать библиотеку "bigint" для обработки строк "bigint" - https://github.com/joelpurra/jq-bigint

...