Как преобразовать строковый JSON-подобный объект surveyjs в настоящий JSON
Я работаю над приложением, которое использует библиотеку опросов. Я создаю инструмент, с помощью которого пользователи могут вводить JSON опроса с этого веб-сайта в форму, которая затем отправляется в виде строки с помощью запроса ajax, который запускает функцию AWS Lambda. Лямбда-функция принимает запрос ajax и вставляет их опрос в экземпляр MongoDB, используя mongoose.
Когда строка входит в лямбда-функцию, она выглядит так:
"{ pages: [ { name: 'page1', elements: [ { type: 'radiogroup', name: 'question1', title: 'IS THIS A SURVEY?', choices: [ { value: 'item1', text: 'Yes' }, { value: 'item2', text: 'No' } ] } ] } ]}"
И когда я пытаюсь разобрать эту строку, я получаю эту ошибку:
Error: JSON Parse error: Expected '}'
Я думаю, что это может быть связано с тем, что ключи JSON не являются строками. Я также читал, что мое использование одиночных кавычек потенциально может быть проблемой, но я исчерпал свою базу знаний.
В целом, мой вопрос: как я могу преобразовать эту строку в объект JSON?
Спасибо!
2 ответа
Для строк JSON их свойства и значения должны быть заключены в двойные кавычки. Используйте регулярное выражение и replace
:
const originalStr = "{ pages: [ { name: 'page1', elements: [ { type: 'radiogroup', name: 'question1', title: 'IS THIS A SURVEY?', choices: [ { value: 'item1', text: 'Yes' }, { value: 'item2', text: 'No' } ] } ] } ]}";
const finalStr = originalStr
.replace(/'/g, '"')
.replace(/(\w+):/g, '"$1":');
console.log(JSON.parse(finalStr).pages);
Тем не менее, было бы лучше исправить все, что служит результатам в первую очередь, если это вообще возможно.
Если ваша лямбда-функция написана с использованием javascript, то вы можете использовать eval
разобрать искаженный JSON, однако eval
'Строка оценивается как фактический javascript в текущем контексте, поэтому для получения результата необходимо установить переменную внутри строки. Пример:
var malformedJsonString = "{unquotedName: 'single quoted value'}";
eval("var myParsedJsonObject = "+malformedJsonString+";");
// myParsedJsonObject now contains your parsed JSON object