Hai bisogno di aiuto per la formattazione di JSON (in JavaScript) con Stringify e Regex replace

Jan 19 2021

Mi manca qualcosa con la regex e sta rimuovendo l'ultima lettera di ogni elemento prima della virgola.

Codice d'esempio:

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

Il risultato è:

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

Quello che sto cercando di ottenere è:

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

Le cose sbagliate:
"uno, dovrebbe essere" uno ",
" tru, dovrebbe essere "vero",

Risposte

3 BenWainwright Jan 19 2021 at 06:36

Il tuo problema è che stai trovando la seguente sequenza di caratteri

  • Qualsiasi carattere che non sia una parentesi graffa di chiusura
  • Una virgola
  • Un carattere di nuova riga
  • Qualsiasi numero di spazi

E sostituendo l'intera sequenza . Poiché la "e" alla fine di "true" non è una parentesi graffa di chiusura, viene anch'essa sostituita.

Ciò di cui hai bisogno è che il primo elemento della sequenza sia "una virgola che viene immediatamente dopo una parentesi graffa di chiusura". Puoi farlo usando uno sguardo 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,   "');

non sono sicuro che sia il modo migliore, ma è la prima cosa che mi è venuta in mente