Преобразование большого числа в строку в Javascript / Node - PullRequest
0 голосов
/ 26 мая 2018

Я видел другие связанные вопросы, но они не решили мою проблему, или, может быть, я как-то пропустил точно такие же разрешенные запросы.

Вот проблема.Служба, которую я вызываю, возвращает JSON-ответ с некоторыми ключами, имеющими большие числа в качестве значений, и я хочу передать их моему представлению и отображению.Проблема в том, что они округляются, чего я не хочу.На самом деле это происходит внутри буфера, из которого я сейчас делаю:

JSON.parse(res.body.toString()) // res.body is a Buffer

и отправляю на просмотр.Как я могу сохранить целое число в виде строки и отправить его для просмотра, чтобы точно такой же доступ был доступен для пользовательского интерфейса.

Я думал, что заменитель поможет, но он тоже не работает.

const replacer = (key, value) => {
    if (typeof value === 'number') {
        return JSON.stringify(value);
    }
    return value;
};

//78787878977987787897897897123456786747398
const obj = {
    name: 'John',
    income: 78787878977987787897897897123456786747398,
    car: null
};

var buf = Buffer.from(JSON.stringify(obj));
console.log(buf.toString());
// console.log(JSON.stringify(buf.toString()))

// console.log('func res: ', replacer('key', 78787878977987787897897897123456786747398))
// console.log(obj.income.toString())
console.log(JSON.stringify(obj, replacer));

Вы можете порекомендовать какую-нибудь внешнюю доверенную библиотеку или, что лучше, предложить мне решение только с помощью прямого кода .

Редактировать:

Короче говоря, результат: Преобразуйте ответ в String перед возвратом с сервера.Как только он попадает в JS (Buffer в моем случае), преобразование уже произошло, что означает, что со стороны приложения ничего не может быть сделано для его извлечения.

Пожалуйста, дайте мне знать, если есть реальное решение для этого без изменения ответа сервера.

1 Ответ

0 голосов
/ 26 мая 2018

К сожалению, число больше, чем max_safe_integer, поэтому, если оно ever , будет проанализировано как число, даже если оно будет преобразовано обратно в строку позже (например, с помощью функции reviver, второй параметрдо JSON.parse), это не будет надежным.Но, к счастью, поскольку у вас есть строка JSON, вы можете replace числовые значения со строковыми значениями перед JSON.parse ее использованием.Например:

const resBody = '{"foo":"bar", "objs":[{"name":"John", "income": 78787878977987787897897897123456786747398}]}';
const resBodyReplaced = resBody.replace(/: *(\d+)/g, ':"$1"');
console.log(JSON.parse(resBodyReplaced).objs[0].income);
...