Besoin d'aide pour formater JSON (en JavaScript) avec Stringify et Regex replace

Jan 19 2021

Il me manque quelque chose avec l'expression régulière et il supprime la dernière lettre de chaque élément avant la virgule.

Exemple de code:

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

Le résultat est:

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

Ce que j'essaie d'obtenir, c'est:

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

Les choses qui ne vont pas:
"un, devrait être" un ",
" vrai, devrait être "vrai",

Réponses

3 BenWainwright Jan 19 2021 at 06:36

Votre problème est que vous trouvez la séquence de caractères suivante

  • Tout caractère qui n'est pas une accolade fermante
  • Une virgule
  • Un caractère de nouvelle ligne
  • N'importe quel nombre d'espaces

Et en remplaçant toute la séquence . Puisque le "e" à la fin de "true" n'est pas une accolade fermante, il est également remplacé.

Ce dont vous avez besoin, c'est que le premier élément de la séquence soit "une virgule qui vient immédiatement après une accolade fermante". Vous pouvez le faire en utilisant un regard négatif en arrière .

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

Je ne suis pas sûr que ce soit le meilleur moyen mais c'est la première chose qui m'est venue à l'esprit