Necesita ayuda para formatear JSON (en JavaScript) con reemplazo de Stringify y Regex

Jan 19 2021

Me falta algo con la expresión regular y está eliminando la última letra de cada elemento antes de la coma.

Código de muestra:

let test_json = { 
    "a" : { "a1" : "one", "is_active" : true, "a2" : "two" },
    "b" : { "b1" : "one", "is_active" : true, "b2" : "two" } 
}; 

JSON.stringify(test_json, null, 3).replace(/[^}],\n( )*"/g, ',   "');

El resultado es:

"{
   "a": {
      "a1": "one,   "is_active": tru,   "a2": "two"
   },
   "b": {
      "b1": "one,   "is_active": tru,   "b2": "two"
   }
}"

Lo que estoy tratando de conseguir es:

"{
   "a": {
      "a1": "one",   "is_active": true,   "a2": "two"
   },
   "b": {
      "b1": "one",   "is_active": true,   "b2": "two"
   }
}"

Las cosas que están mal:
"uno, debería ser" uno ",
" tru, debería ser "verdadero",

Respuestas

3 BenWainwright Jan 19 2021 at 06:36

Tu problema es que estás encontrando la siguiente secuencia de caracteres

  • Cualquier personaje que no sea una llave de cierre
  • Una coma
  • Un personaje de nueva línea
  • Cualquier cantidad de espacios

Y reemplazando toda la secuencia . Dado que la "e" al final de "verdadero" no es una llave de cierre, también se reemplaza.

Lo que necesita es que el primer elemento de la secuencia sea "una coma que venga inmediatamente después de una llave de cierre". Puede hacer esto usando una mirada atrás negativa .

let test_json = {
  a: {
    a1: "one",
    is_active: true,
    a2: "two"
  },
  b: {
    b1: "one",
    is_active: true,
    b2: "two"
  },
};

const result = JSON.stringify(test_json, null, 3).replace(
  /(?<!}),\n\s*/g,
  ", "
);

console.log(result);

1 MCP Jan 19 2021 at 06:31
JSON.stringify(test_json,null,3).replace(/([^}]?),\n( )*"/g, '$1,   "');

No estoy seguro de si es la mejor manera, pero es lo primero que me viene a la mente.