Estoy tratando de adaptar JSON.Parse() para NaN.
console.log(JSON.parse('{"n": 1}')); console.log(JSON.parse('{"n": NaN}'));El primero es {n:1}.
El segundo tiene un error que dice Unexpected token N in JSON . Y quiero cambiar NaN a 0 como {n: 0} .
Encontré un recurso que crea JSON Parser desde cero. https://lihautan.com/json-parser-with-javascript/#implementing-the-parser
Es bueno que separe las claves y los valores para que pueda verificar solo los valores si hay NaN y arreglarlo. Pero el problema es que no tengo idea de dónde puedo poner el NaNParser() y el proceso. Porque el parámetro parece venir 1 por 1 carácter.
Si pudieras darme un consejo, me sería de gran ayuda. https://codesandbox.io/s/json-parser-with-error-handling-hjwxk?from-embed
Contexto
Tenga en cuenta que JSON.stringify({"n": NaN}) genera: '{"n":null}'
Eso significa:
NaN no es un valor serializado válido.null , no en 0 (porque no es un número)Solución
Quizás el enfoque más rápido es simplemente reemplazar todos los valores de NaN antes de analizarlos.
const input = '{"o": 1, "n": NaN, "m": "test"}' const output = input.replace(/(:\s*)NaN(\s*[,}])/, '$1null$2') console.log(output) // prints: '{"o": 1, "n": null, "m": "test"}' Alternativamente, podría usar sed en la terminal:
sed -e "s/pattern/replacement/g" <input.txt >output.txtSolución "hacky":
var json = '{"n": NaN}'; var object = JSON.parse(json.replace("NaN", "\"NaN\"")); for(var key in object) { if(object[key] == "NaN") { object[key] = NaN; } } console.log(object);Esto reemplaza todos los valores de NaN en el JSON con la cadena "NaN", luego lo ejecuta a través de JSON.parse y luego vuelve a reemplazar toda la cadena "NaN" en el objeto con NaN real.
Si necesita producir JSON con valores cero en lugares donde NaN estaba en la fuente, puede usar un serializador bastante simple ("reemplazo") durante JSON.stringify
console.log( JSON.stringify( // source data: { a: 1, b: NaN }, // "replacer": function(key, value) { if (Number.isNaN(value)) { return 0 } return value }, // optional, indent character for formatting: "\t" ) ) Para preservar los valores de NaN , debe proporcionar un reemplazo personalizado que produzca una estructura única que lo represente en una cadena JSON sintácticamente válida, y usar un "revividor" adecuado mientras JSON.parse para recuperarlo:
var original_data = { a: 1, NaN: NaN, NaNaNaNa: { Batman: true, baNaNa: NaN, } } const extra_type_value_key = "__value__"; const NaN_signal = "NaN, dude"; const NaN_representation = { [extra_type_value_key]: NaN_signal }; function replacer(key, value) { if (Number.isNaN(value)) { return NaN_representation; } return value } const data_JSON_string = JSON.stringify(original_data, replacer, "\t"); console.log("Data as JSON string:", data_JSON_string); function reviver(key, value) { if (value && value[extra_type_value_key] && value[extra_type_value_key] === NaN_signal) { return NaN } return value } const data_POJO = JSON.parse(data_JSON_string, reviver, "\t"); console.log("Object from JSON string, should be same as original_data", data_POJO); // unrelated onload=()=>{with(document.querySelector('div').style)top=0,maxHeight='none'} Además, para un propósito similar, el uso de la práctica oscura de la eval malvada de una cadena similar a JSON funcionaría:
var original_data_string = `{ a: 1, b: NaN, NaNaNa: { Batman: NaN, baNaNa: 3, NaN: 4 } }`; var data_object = eval(`(${original_data_string})`); console.log(data_object);Por el amor de Dios, no haga reemplazos de expresiones regulares en cadenas fuente JSON, ¡especialmente si no conoce la forma de los datos!