Jer*_*lle 1 javascript string parsing json object
我知道如何解析有效的JSON字符串:JSON.parse('{"key" : "value"}').
但对于一个有效的JS对象,但无效JSON,如:JSON.parse("{ key : 'value'}")?上面的例子抛出:
未捕获的SyntaxError:位于2的JSON中的意外标记k
我的实际目标更加棘手.我想解析一个JS对象的字符串,该对象包含RegEx(不受JSON支持但JS支持)到JS对象中:
'{ key1 : /val1/g , key2 : /val2/i }'
Run Code Online (Sandbox Code Playgroud)
我最终希望将此对象与Mongoose一起使用并使用它查找文档:
Model.find({
key1 : /val1/g ,
key2 : /val2/i
})
Run Code Online (Sandbox Code Playgroud)
我尝试将相当复杂的RegEx应用于我的String,替换/val1/g为new RegEx("val1","i"):
str = str.replace( /\/(.+?)\/(g?i?).+?(?=,|})/g , "new RegExp(`$1`,`$2`)" )
Run Code Online (Sandbox Code Playgroud)
该.replace()操作以我想要的方式工作并修改字符串.它产生:
{ key1 : new RegExp("val1","g") , key2 : new RegExp("val2","i") }
Run Code Online (Sandbox Code Playgroud)
但是当我尝试应用JSON.parse它时,它仍然失败,因为new RegEx("val1","i")它不是有效值.
如果您控制并且可以信任您要转换的文本,则可以使用eval:
var str = '{ key1 : /val1/g , key2 : /val2/i }';
var obj = eval("(" + str + ")");
console.log(obj.key1);Run Code Online (Sandbox Code Playgroud)
请注意,在执行此操作时eval,由于表达式的开头{,您必须将其包装,()以便解析器知道启动对象初始值设定项,而不是块.
关于eval:
它允许任意代码执行.所以你真的要相信你正在发表的文字eval.不要eval用户输入.
直接包含调用的执行上下文中的代码eval基本上无法优化,因为JavaScript引擎在解析代码时无法知道字符串将包含什么.因此,虽然从技术上讲我认为它是不成熟的优化,但我会将上述内容放在您从主逻辑调用的函数中,而不是直接将其嵌入主逻辑中.