Ребята, помогите! Столкнулся с проблемой при работе с API. Сервер возвращает строку, которая не является валидным JSON. Менять что-то на стороне сервера я не могу. Вот пример того, что приходит:
var _nr_metadata = {
site_base_url : "http://example.com",
issue_name : "some_feed",
category_name : "News"
}
var _nr_stories = [
{
title : "Важная новость",
url : "http://example.com/news/1",
source : "Известный источник",
date : "26.10.2023"
},
''
]
Пробовал разные способы парсинга, но везде возникают проблемы. То лишние пробелы в ключах появляются, то еще что-нибудь. Как правильно распарсить такую строку и получить нормальный JSON-объект? Буду благодарен за любые идеи!
Вот что можно попробовать: сначала убрать объявления переменных, потом заменить одинарные кавычки на двойные. После этого обернуть ключи в кавычки. Примерно так:
const cleanedStr = responseStr
.replace(/var .+ = /, ‘’)
.replace(/'/g, ‘"’)
.replace(/(\w+)\s*:/g, ‘“$1”:’);
const jsonObj = JSON.parse(cleanedStr);
Должно сработать, но могут быть нюансы. Проверь и дай знать, если что!
А я бы предложил использовать регулярки для извлечения данных. Примерно так:
const metadataMatch = responseStr.match(/_nr_metadata = ({[^}]+})/);
const storiesMatch = responseStr.match(/_nr_stories = (\[[^\]]+\])/);
const metadata = JSON.parse(metadataMatch[1].replace(/'/g, '"'));
const stories = JSON.parse(storiesMatch[1].replace(/'/g, '"'));
const result = { metadata, stories };
Этот подход более гибкий и меньше шансов что-то сломать. Главное - аккуратно с кавычками.
слушай, я тут подумал и есть еще вариант - использовать eval(). да, знаю, что это небезопасно, но иногда выручает. можно так:
const cleanResponse = responseStr.replace(/var nr/g, ‘const nr’);
eval(cleanResponse);
теперь у тебя есть переменные _nr_metadata и _nr_stories, с которыми можно работать. только осторожно, убедись что данные приходят из надежного источника.
а вообще, если есть возможность, лучше конечно попросить бэкенд отдавать нормальный json. так будет и проще и безопаснее работать с данными.