如何使用Ext.decode()替换对JavaScript的eval()的某些调用?

时间:2018-09-21 13:55:16

标签: javascript json extjs eval

我们正在尝试摆脱JavaScript中所有的eval()调用。不幸的是,我不是一个JavaScript程序员,我需要一些帮助。

我们的许多eval()调用都对字符串(来自Web服务的输出)进行操作,这些字符串非常类似于JSON,例如,我们可以评估以下字符串:

ClassMetaData['Asset$Flex'] = {
  fields: {
    }
  ,label: 'Flex Fields'
};

我在互联网上看到了各种建议Ext.decode()。其documentation表示-“将JSON字符串解码(解析)为对象。如果JSON无效,除非设置了安全选项,否则此函数将引发SyntaxError。”据我了解,作为参数提供的字符串不是合法的JSON(未引用字段名称),但是无论如何Ext.decode()几乎都对我有用。如果我解码上述字符串,则会收到错误消息(为什么?)-“未捕获的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. 是否有更好的方法比较结果 比evaldecodeJSON.stringify(decoded) == JSON.stringify(evaled)

0 个答案:

没有答案