Сохранение экспоненциальной записи числа после перевода в формат JSON

У меня есть строка msg

const msg = '{"bids": [[2.456e-05, 2680.0], [2.455e-05, 3790.0], [2.453e-05, 3370.0], [2.45e-05, 3950.0]] }';

Я перевожу msg в JSON

const data = JSON.parse(msg);

И после этого числа записываются без экспоненты:

{
  bids: [
    [ 0.00002456, 2680 ],
    [ 0.00002455, 3790 ],
    [ 0.00002453, 3370 ],
    [ 0.0000245, 3950 ]
  ]
}

Есть ли вариант сохранить экспонентную запись? Мне она нужна. Можно ли например, чтобы метод parse сохранял числа как строки, чтобы там остались экспоненты?


Ответы (2 шт):

Автор решения: vsemozhebuty

Возпользуйтесь параметром reviver:

const msg = '{"bids": [[2.456e-05, 2680.0], [2.455e-05, 3790.0], [2.453e-05, 3370.0], [2.45e-05, 3950.0]] }';

const data = JSON.parse(
  msg,
  (key, value) => key === '0' && typeof value === 'number' ?
    value.toExponential() :
    value,
);

console.log(data);

→ Ссылка
Автор решения: yar85

Можно ли например, чтобы метод parse сохранял числа как строки, чтобы там остались экспоненты?

Да, для этого можно исходный JSON подредактировать:

const msg = '{"bids": [[2.456e-05, 2680.0], [2.455e-05, 3790.0], [2.453e-05, 3370.0], [2.45e-05, 3950.0]] }';

const modified = msg.replace(/\d+(?:\.\d*)?e[+-]?\d*/g, '"$&"');
console.log(JSON.parse(modified));

Тут все числовые значения в экспоненциальной записи (содержащие символ e) оборачиваются в двойные кавычки - в результате, эти значения будут разобраны как строковые.

Такой способ менее красив и надежен чем перетипкаст string?number?string, но он позволяет в точности сохранять сериализованный вид числа.
Ненадежность в том что если в JSON окажется строковый литерал с таким числом, подобная замена "сломает" данные - в таком случае, на их разборе будет возникать ошибка из-за нарушения парности кавычек (отсутствия экранирования вложенных). Для повышения надежности потребуется самостоятельно написать (или найти на npm) полноценный парсер JSON с возможностью оставлять часть значений в исходном строковом виде.

→ Ссылка