node.js есть ли правильный способ разобрать JSON с большими числами? (длинный, большой, int64)

Когда я разбираю этот маленький кусочек JSON

{ "value" : 9223372036854775807 }

это то, что я получаю

{ hello: 9223372036854776000 } 

Есть ли способ правильно его разобрать?


person tartakynov    schedule 12.09.2013    source источник
comment
Возможно, это актуально stackoverflow.com/questions/307179/   -  person TGH    schedule 12.09.2013
comment
спасибо, но я знаю целочисленную точность в js, теперь мне нужно проанализировать JSON из веб-службы C #, у которой нет проблем с большими целыми числами   -  person tartakynov    schedule 12.09.2013
comment
Можно создать регулярное выражение, которое будет выборочно преобразовывать все целые числа или только большие целые числа или все числа в строки, предполагая, что JSON действителен.   -  person Konstantin Pelepelin    schedule 05.12.2019


Ответы (2)


Не со встроенным JSON.parse. Вам нужно будет проанализировать его вручную и обработать значения как строку (если вы хотите выполнять с ними арифметические действия, есть bignumber .js) Вы можете использовать библиотеку Дугласа Крокфорда JSON.js в качестве основы для своего парсер.

EDIT2 (через 7 лет после первоначального ответа) - скоро это можно будет решить с помощью стандартного JSON API. Взгляните на это предложение TC39 по добавлению доступа к исходной строке в функцию восстановления — https://github.com/tc39/proposal-json-parse-with-source

EDIT1: я создал для вас пакет :)

var JSONbig = require('json-bigint');

var json = '{ "value" : 9223372036854775807, "v2": 123 }';
console.log('Input:', json);
console.log('');

console.log('node.js bult-in JSON:')
var r = JSON.parse(json);
console.log('JSON.parse(input).value : ', r.value.toString());
console.log('JSON.stringify(JSON.parse(input)):', JSON.stringify(r));

console.log('\n\nbig number JSON:');
var r1 = JSONbig.parse(json);
console.log('JSON.parse(input).value : ', r1.value.toString());
console.log('JSON.stringify(JSON.parse(input)):', JSONbig.stringify(r1));

Выход:

Input: { "value" : 9223372036854775807, "v2": 123 }

node.js bult-in JSON:
JSON.parse(input).value :  9223372036854776000
JSON.stringify(JSON.parse(input)): {"value":9223372036854776000,"v2":123}


big number JSON:
JSON.parse(input).value :  9223372036854775807
JSON.stringify(JSON.parse(input)): {"value":9223372036854775807,"v2":123}
person Andrey Sidorov    schedule 12.09.2013
comment
что требуется? Это из requireJS? - person Vyache; 14.02.2014
comment
Что-то вроде. Примеры предназначены для запуска из node.js - person Andrey Sidorov; 14.02.2014
comment
Есть ли способ запустить это без node.js? Как в среде браузера? Я не могу понять это, мне просто нужно изменить некоторые длинные значения и преобразовать их в объект JSON. - person Vyache; 14.02.2014
comment
Вам необходимо объединить index.js + stringify.js + bignumber.js - person Andrey Sidorov; 14.02.2014
comment
Я создал пакет, который вы можете добавить на веб-страницу с помощью browserify.org — просто добавьте этот скрипт и используйте JSONbig.parse / JSONbig.stringify - person Andrey Sidorov; 14.02.2014
comment
@AndreySidorov Спасибо за модуль. Однако синтаксический анализ больших чисел приводит к результатам объекта, а не к числам. Я понимаю, что это обычная логика для обработки этих больших чисел, но для вызова toString() для каждого значения требуется особая осторожность, что является большой разницей. Любые идеи о том, как на самом деле получить числовые значения больших чисел (js)? - person Alon Weissfeld; 11.08.2016
comment
вы можете установить флаг для сохранения их в виде строк — github.com/sidorares / : var JSONbigString = require('json-bigint')({"storeAsString": true}); - person Andrey Sidorov; 11.08.2016

вы можете использовать этот код для преобразования больших чисел в строки, а затем использовать BigInt (data.value)

let str = '{ "value" : -9223372036854775807, "value1" : "100" }'
let data = JSON.parse(str.replace(/([^"^\d])(-?\d{1,90})([^"^\d])/g, '$1"$2"$3'));
console.log(BigInt(data.value).toString());
console.log(data);

person abdolmajid azad    schedule 03.10.2018
comment
Вы уверены, что "value": 9223372036854776000, является предполагаемым результатом? - person connexo; 10.09.2019
comment
Хотя можно создать регулярное выражение, которое заключает в кавычки только числа, предоставленное регулярное выражение дает неверный результат. Кроме того, это также разобьет числа, которые уже заключены в кавычки, или части строк в кавычках. - person Konstantin Pelepelin; 05.12.2019
comment
правильное регулярное выражение будет: /([0-9]{15,30}\.{0,1}[0-9]{0,})/g без $ в середине - person scyrizales; 02.11.2020