#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);