Нужна помощь в форматировании JSON (в JavaScript) с заменой Stringify и Regex

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"
   }
}"

То, что неправильно:
«один, должен быть один»,
«правда, должен быть»,

Ответы

3 BenWainwright Jan 19 2021 at 06:36

Ваша проблема в том, что вы находите следующую последовательность символов

  • Любой символ, не являющийся закрывающей скобкой
  • Запятая
  • Символ новой строки
  • Любое количество пробелов

И заменяя всю последовательность . Поскольку буква «e» в конце слова «true» не является закрывающей фигурной скобкой, она также заменяется.

Вам нужно, чтобы первым элементом в последовательности была «запятая, которая идет сразу после закрывающей фигурной скобки». Вы можете сделать это, используя отрицательный ретроспективный просмотр .

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

не уверен, что это лучший способ, но это первое, что пришло в голову