Potrzebujesz pomocy w formatowaniu JSON (w JavaScript) z zamianą Stringify i Regex

Jan 19 2021

Brakuje mi czegoś w wyrażeniu regularnym i usuwa ostatnią literę każdego elementu przed przecinkiem.

Przykładowy kod:

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

Wynik to:

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

To, co próbuję uzyskać, to:

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

Rzeczy, które są złe:
„jeden, powinien być„ jeden ”,
„ prawda, powinien być „prawdziwy”,

Odpowiedzi

3 BenWainwright Jan 19 2021 at 06:36

Twój problem polega na tym, że znajdujesz następującą sekwencję znaków

  • Dowolny znak, który nie jest nawiasem zamykającym
  • Przecinek
  • Znak nowego wiersza
  • Dowolna liczba spacji

I zastępując całą sekwencję . Ponieważ litera „e” na końcu wyrażenia „prawda” nie jest nawiasem zamykającym, jest również zastępowana.

To, czego potrzebujesz, to aby pierwszy element w sekwencji był „przecinkiem znajdującym się bezpośrednio po nawiasie zamykającym”. Możesz to zrobić, używając negatywnego lookbehind .

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

Nie jestem pewien, czy to najlepszy sposób, ale to pierwsza rzecz, która przyszła mi do głowy