Сохранение экспоненциальной записи числа после перевода в формат 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 шт):
Возпользуйтесь параметром 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);
Можно ли например, чтобы метод 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 с возможностью оставлять часть значений в исходном строковом виде.