Мое значение - строка:
"['Eitaj', 'Jason Json', 'Eitaj M', "Jason Json's"]"
Пытаюсь разобрать с помощью JSON.parse(),
однако я получаю ошибку
Uncaught SyntaxError: Unexpected token ' in JSON at position 1
Я выяснил, что правильная рабочая строка:
JSON.parse('["Eitaj", "Jason Json", "Eitaj M", "Jason Json\'s"]')
Есть ли какой-нибудь трюк, который я могу использовать, кроме помещения одинарных кавычек в двойные кавычки?
@Zenoo "['Eitaj', 'Jason Json', 'Eitaj M', \"Jason Json's\"]", сохранит строку как "['Eitaj', 'Jason Json', 'Eitaj M', "Jason Json's"]"
Если вам в конечном итоге понадобится извлечь отдельные имена (Eitaj, Jason Json ...), объект JSON не принесет большой пользы, потому что, ну, у вас нет JSON для начала. Есть ли у вас контроль над форматом данных?
@ ÁlvaroGonzález нет, это строка из другой системы, как я писал.
Вы уверены, что это должен быть JSON? Потому что он не уважает ни ECMA-404, ни RFC7159, если он использует одинарные кавычки для заключения строк.
Тогда вы обречены получать удовольствие от регулярных выражений и множества догадок. Это не стандартный формат, и я предполагаю, что это даже не согласованный формат. Простите.
@ ÁlvaroGonzález Я думаю, что python json.dumps приводит к смешанной одинарной кавычке .. :(
@Pete JSON.parse также может анализировать массив



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проверьте, работает ли это для вас.
let s = "['Eitaj', 'Jason Json', 'Eitaj M', \"Jason Json's\"]";
let parsed = JSON.parse(s.split(",").map(seg => {
return seg.replace(new RegExp("'.*'", "g"), function(match) {
return '"' + match.substring(1, match.length - 1) + '"';
})
}).join(","));
console.info(parsed);Обновление 1
Это устранит недостатки приведенного выше фрагмента, упомянутые в комментариях. Однако могут быть и другие крайние случаи, которые следует обрабатывать в соответствии с вашими требованиями.
let s = "['Eitaj', 'Jason Json', 'Eitaj M', \"Jason Json's\",\"Test'test'Test\",'Acme, Inc.',\"'Test'\"]";
let parsed = JSON.parse("[" + s.substring(1, s.length - 1).match(new RegExp(`((['\""]).*?(\\2))`, "g")).map(seg => {
return seg.trim().replace(new RegExp("^'.*'$", "g"), function(match) {
return '"' + match.substring(1, match.length - 1) + '"';
})
}).join(",") + "]")
console.info(parsed);Осторожно, это обречено на неудачу для значений, правильно заключенных в двойные кавычки, которые содержат как минимум две одинарные кавычки, например "Test'test'Test"
... или имена через запятую ('Acme, Inc.').
Обновлено для обработки упомянутых потоков. Не пробовал обрабатывать другие крайние случаи. Хотя может быть много других.
@ChathuraWidanage для моих ограничений это идеально.
Ваша первая строка недействительна.