StringifyとRegexの置換でJSON(JavaScript)をフォーマットするのに助けが必要

Jan 19 2021

正規表現に何かが欠けていて、コンマの前の各項目の最後の文字が削除されています。

サンプルコード:

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

結果は次のとおりです。

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

私が取得しようとしているのは:

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

間違っていること:
「1つは「1つ」である必要があります」、
「truは「真」である必要があります」

回答

3 BenWainwright Jan 19 2021 at 06:36

あなたの問題はあなたが次の文字のシーケンスを見つけているということです

  • 閉じ中括弧ではない文字
  • カンマ
  • 改行文字
  • 任意の数のスペース

そして、シーケンス全体を置き換えます。「true」の末尾の「e」は閉じ中括弧ではないため、同様に置き換えられます。

必要なのは、シーケンスの最初の項目が「閉じ中括弧の直後に来るコンマ」である必要があります。ネガティブルックビハインドを使用してこれを行うことができます。

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

それが最善の方法かどうかはわかりませんが、最初に頭に浮かんだのは