Precisa de ajuda na formatação de JSON (em JavaScript) com Stringify e Regex replace

Jan 19 2021

Estou faltando algo com o regex e ele está removendo a última letra de cada item antes da vírgula.

Código de amostra:

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, ',   "');

O resultado é:

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

O que estou tentando obter é:

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

As coisas que estão erradas:
"um, deveria ser" um ",
" tru, deveria ser "verdadeiro",

Respostas

3 BenWainwright Jan 19 2021 at 06:36

Seu problema é que você está encontrando a seguinte sequência de caracteres

  • Qualquer caractere que não seja uma chave de fechamento
  • Uma vírgula
  • Um caractere de nova linha
  • Qualquer número de espaços

E substituindo toda a sequência . Como o "e" no final de "verdadeiro" não é uma chave de fechamento, ele também é substituído.

O que você precisa é que o primeiro item na sequência seja "uma vírgula que vem imediatamente após uma chave de fechamento". Você pode fazer isso usando um lookbehind negativo .

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,   "');

não tenho certeza se é a melhor maneira, mas é a primeira coisa que me vem à mente