JS:如何将字符串转换为JS对象(** NOT **到JSON)?

时间:2016-07-26 16:09:59

标签: javascript json string parsing object

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

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

  

Uncaught SyntaxError:位置2的JSON中出现意外的标记k

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

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

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

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

我尝试将相当复杂的RegEx应用于我的String,将/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")不是有效值。

1 个答案:

答案 0 :(得分:9)

如果 您可以控制并且可以信任您要转换的文字,则可以使用eval

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

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

关于eval的几点说明:

  1. 它允许任意代码执行。所以你真的必须相信你eval的文本。请勿eval用户输入。

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