Force JSON.stringify(), чтобы испускать NaN/Infinity или JS JSON lib, который делает это

66
4

Я изучаю возможность добавления поддержки NaN/Infinity в уже существующее научное приложение, которое использует JSONRPC для взаимодействия клиент/сервер. Многие библиотеки JSON обрабатывают (возможно, в некоторых случаях) NaNs и Infs, например:

    Python json читает и пишет Java Jackson читает, но записывает строки вместо простых слов Java GSON читает и пишет Javascript может читать

Я знаю, что NaN и Infinity не поддерживаются в спецификации JSON, и я знаю о связанных вопросах. Тем не менее, AFAICT вопрос о том, есть ли способ JSON.stringify() метода JS JSON.stringify() для испускания NaN/Infinity или, альтернативно, там JS JSON-библиотека, которая делает то же самое, не отвечает. Тонкая разница с указанными вопросами, возможно, но важная. До сих пор я не мог обнаружить такой метод или библиотеку, поэтому я здесь. Это единственный вариант, который записывает собственный JSON-сериализатор?

Обратите внимание, что параметр replacement JSON.stringify() не помогает, по крайней мере, в моих руках.

ОБНОВЛЕНИЕ: Испускание NaN/Бесконечность и т.д., Поскольку строки делают семантику этих строк неоднозначными. Они должны быть выпущены как простые слова, как в реализациях Python и GSON.

спросил(а) 2020-04-04T00:33:35+03:00 3 месяца назад
1
Решение
76

Вот пример

Javascript

var array1 = [-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity],
json = JSON.stringify(array1, function (key, value) {
if (value !== value) {
return 'NaN';
}

if (value === Infinity) {
return 'Infinity';
}

if (value === -Infinity) {
return '-Infinity';
}

return value;
}),
array2 = JSON.parse(json, function (key, value) {
if (value === 'NaN') {
return NaN;
}

if (value === 'Infinity') {
return Infinity;
}

if (value === '-Infinity') {
return -Infinity;
}

return value;
});

console.log(json);
console.log(array2);

Вывод

["-Infinity",-1,0,1,2,"NaN",4,5,"Infinity"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity]

Рекомендации

JSON.stringify

JSON.parse

На jsFiddle

Обновить:

Javascript

var array1 = [-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity],
json = JSON.stringify(array1, function (key, value) {
if (value !== value) {
return '0/0';
}

if (value === 1/0) {
return '1/0';
}

if (value === -1/0) {
return '-1/0';
}

return value;
}),
array2 = JSON.parse(json, function (key, value) {
if (value === '0/0') {
return 0/0;
}

if (value === '1/0') {
return Infinity;
}

if (value === '-1/0') {
return -1/0;
}

return value;
});

console.log(json);
console.log(array2);

Вывод

["-1/0",-1,0,1,2,"0/0",4,5,"1/0"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity]

На jsFiddle

ответил(а) 2020-04-04T00:48:31.809569+03:00 3 месяца назад
39

параметр replacement JSON.stringify - вполне подходящий инструмент для работы.

JSON.stringify(data, function(key, value) {
if (value === Infinity) {
return "Infinity";
} else if (value === -Infinity) {
return "-Infinity";
} else if (value !== value) {
return "NaN";
}
return value;
});

А с другой стороны, вы можете использовать reviver параметр JSON.parse.

 JSON.parse(data, function(key, value) {
if (value === "Infinity") {
return Infinity;
} else if (value === "-Infinity") {
return -Infinity;
} else if (value === "NaN") {
return NaN;
}
return value;
});

ответил(а) 2020-04-04T00:33:35+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема