Как я могу заменить некоторые вызовы JavaScript eval () на Ext.decode ()? - PullRequest
0 голосов
/ 21 сентября 2018

Мы пытаемся избавиться от всех наших 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».)

Мои вопросы:

  1. Можем ли мы с небольшим объемом работы создать общее решениеиспользуя decode?
  2. Есть ли простой способ преобразовать наш JSON-подобный ввод в настоящий JSON?
  3. Есть ли лучший способ сравнения результатов eval и decode, чем JSON.stringify(decoded) == JSON.stringify(evaled)?
...