Мы пытаемся избавиться от всех наших eval()
вызовов в нашем JavaScript.К сожалению, я не большой программист на JavaScript, и мне нужна помощь.
Многие из наших eval()
вызовов работают со строками, выводимыми из веб-службы, которые, например, очень похожи на JSON,мы могли бы получить следующую строку:
ClassMetaData['Asset$Flex'] = {
fields: {
}
,label: 'Flex Fields'
};
Я видел различные предложения в Интернете, предлагающие Ext.decode()
.Документация для него гласит: «Декодирует (анализирует) строку JSON к объекту. Если JSON недопустим, эта функция выдает ошибку SyntaxError, если не установлена безопасная опция».Строка, которую я предоставляю в качестве аргумента, не является допустимым JSON, насколько я понимаю (имена полей не заключены в кавычки), но Ext.decode()
почти все равно работает для меня.Если я декодирую приведенную выше строку, я получаю сообщение об ошибке (почему?) - «Uncaught SyntaxError: Неожиданный токен;».Однако, если я удаляю завершающую точку с запятой и декодирую, все выглядит нормально.
Я использую следующий код, чтобы определить, делают ли вызов decode
и вызов eval
одно и то же:
var evaled = eval(inputString);
var decoded = Ext.decode(inputString.replace(";", "")); // remove trailing ";", if any
console.log("Equal? - " + (JSON.stringify(decoded) == JSON.stringify(evaled)));
К сожалению, это не очень хорошее решение.Например, некоторые из входных строк для eval
довольно сложны.Они могут содержать всевозможные встроенные символы - точки с запятой, кодировки символов HTML и т. Д. Decode
может жаловаться на некоторые другие проблемы с синтаксисом, кроме точек с запятой в конце, и я не нашел хорошего способа определить, в чем заключается проблема.декодировать объекты в.(Например, он не говорит «недопустимый символ в позиции 67».)
Мои вопросы:
- Можем ли мы с небольшим объемом работы создать общее решениеиспользуя
decode
? - Есть ли простой способ преобразовать наш JSON-подобный ввод в настоящий JSON?
- Есть ли лучший способ сравнения результатов
eval
и decode
, чем JSON.stringify(decoded) == JSON.stringify(evaled)
?