javascript - JS : how to convert a string to JS Object (**NOT** to JSON)?

标签 javascript json string parsing object

我知道如何解析有效的 JSON 字符串:JSON.parse('{"key": "value"}')

但是有效的 JS 对象,但无效的 JSON,比如:JSON.parse("{ key : 'value'}") 呢? 上面的例子抛出:

Uncaught SyntaxError: Unexpected token k in JSON at position 2

我的实际目标更加棘手。我想将一个 JS 对象的字符串包含 RegEx(JSON 不支持但 JS 支持)解析为 JS 对象:

'{ key1 : /val1/g , key2 : /val2/i }'

我最终想将此对象与 Mongoose 一起使用并使用它查找文档:

Model.find({
     key1 : /val1/g ,
     key2 : /val2/i
})

我尝试将相当复杂的 RegEx 应用于我的字符串,将 /val1/g 替换为 new RegEx("val1","i") :

str = str.replace( /\/(.+?)\/(g?i?).+?(?=,|})/g , "new RegExp(`$1`,`$2`)" )

.replace() 操作有效并按照我想要的方式修改字符串。它产生:

{ key1 : new RegExp("val1","g") , key2 : new RegExp("val2","i") }

但是当我尝试对其应用 JSON.parse 时,它仍然失败,因为 new RegEx("val1","i") 不是有效值。

最佳答案

如果您可以控制并信任您正在转换的文本,您可以使用eval:

var str = '{ key1 : /val1/g , key2 : /val2/i }';
var obj = eval("(" + str + ")");
console.log(obj.key1);

请注意,在执行 eval 时,由于您的表达式以 { 开头,因此您必须将其包装在 () 中,以便解析器知道那是在启动一个对象初始值设定项,而不是一个 block 。

关于 eval 的一些注意事项:

  1. 它允许任意代码执行。所以你真的必须相信你正在eval的文本。不要评估用户输入。

  2. 直接包含对 eval 调用的执行上下文中的代码基本上无法优化,因为 JavaScript 引擎在解析代码时无法知道字符串将包含什么。因此,虽然我认为从技术上讲这是不成熟的优化,但我会将上述内容隐藏在您从主逻辑调用的函数中,而不是直接将其嵌入到主逻辑中。

关于javascript - JS : how to convert a string to JS Object (**NOT** to JSON)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38594912/

相关文章:

javascript - 如何围绕现有的 Javascript 库创建 Angular 包装器?

javascript - ng-repeat 与 JSON 对象不打印

javascript:原始字符串有方法吗?

regex - perl生成字符串来匹配正则表达式

javascript - 性能 - String.charAt(0) 与/^.{1}/

javascript - 如何检测所有动画何时停止?

javascript - 如何遍历对象中编号的属性?

PHP - 插入带有先前选择语句结果名称的表

页面上的javascript随机图像加载并在一段时间内发生变化

java - 在java中连接两个json对象