получить то, что находится внутри объекта в строке

#javascript

#javascript

Вопрос:

У меня есть эта строка:

 const test = `
{
  "name": "Error",
}

{
  "name": "Signup Success",
  "status": "400",
  "body": {
     "name": {
        "first": "test",
      },
      "roles": [
       "user"
      ],
      "isMale": true,
  }
}
`
  

Как я могу получить то, что находится внутри двух объектов по отдельности. Например, первый объект содержит "name": "Error" , а второй объект содержит :

   "name": "Signup Success",
  "status": "400",
  "body": {
     "name": {
        "first": "test",
      },
      "roles": [
       "user"
      ],
      "isMale": true,
  }
  

Комментарии:

1. Вам пришлось бы разобрать это самостоятельно. JSON.parse работает только для JSON, но эта строка не является JSON.

2. Откуда берется строка? для декодирования JSON у вас не может быть оставшихся запятых, как в "isMale": true,

3. Я извлекаю это из файла, содержимое записано в формате doc

4. Трудно сказать, не имея разделителя между объектом-строкой и другим объектом-строкой. Вы могли бы создать синтаксический анализатор, но это непросто

5. split("rnrn") ?

Ответ №1:

Вы можете создать анализатор:

 const test = `
{
  "name": "Error",
}

{
  "name": "Signup Success",
  "status": "400",
  "body": {
     "name": {
        "first": "test",
      },
      "roles": [
       "user"
      ],
      "isMale": true,
  }
}
`;

const addCommas = str => {
  const charactersArray = Array.from(str.replace(/s/g, ''));
  charactersArray.reduce((acc, curr, index, self) => {
    if (curr === '{') acc  ;
    if (curr === '}') acc--;
    if (acc === 0 amp;amp; curr === '}') self[index] = '},';
    return acc;
  }, 0);
  return charactersArray.join('').replace(/,}/g, '}').replace(/,$/, '');
};

const parsedObject = JSON.parse('[' addCommas(test) ']');

parsedObject.forEach((el, i) => {
  console.log(`Element ${i 1} name: ${el.name}`);
});  

Это на 100% безопасно, потому что также и строки lile "}{" не вызывают проблем

Комментарии:

1. » Это на 100% безопасно » — далеко не так. Это приводит к полному разрыву или изменению содержимого для разных строк, например, {"name": "}{"} или {"name": ""}{"} .

Ответ №2:

Если это только в том формате, который вы опубликовали, вы можете просто split использовать nn в качестве разделителя:

 let objects = test.split("nn")
  

И если результирующий код является допустимым JSON (в примере он недействителен), вы можете проанализировать его:

 let parsed = objects.map(JSON.parse)
  

Допустимый JSON был бы:

 const test = `
{
    "name": "Error"
}

{
    "name": "Signup Success",
    "status": "400",
    "body": {
        "name": {
            "first": "test"
        },
        "roles": [
            "user"
        ],
        "isMale": true
    }
}
`
  

Ответ №3:

Используйте String#replace, чтобы избавиться от завершения , (например: "name": {"first": "test",} после «test»)

.replace(/,(n*s*)(})/g, "$2")

Затем используйте String#split, выделяя пробел между } и { (обратите внимание, регулярные выражения LookBehinds еще не везде реализованы)

.split(/(?<=})n (?={)/)

Затем Array#map для преобразования каждого раздела в объекте.

 const test = `
{
  "name": "Error",
}

{
  "name": "Signup Success",
  "status": "400",
  "body": {
     "name": {
        "first": "test",
      },
      "roles": [
       "user"
      ],
      "isMale": true,
  }
}
`

const [error, data] = test
.replace(/,(n*s*)(})/g, "$2")
.split(/(?<=})n (?={)/)
.map(raw=>JSON.parse(raw));

console.log(error, data);