Как преобразовать строку ответа сервера в корректный JSON с помощью JavaScript?

Ребята, помогите! Столкнулся с проблемой при работе с 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. так будет и проще и безопаснее работать с данными.