转换非标准json/对象字符串为标准字符串?

字符串:

let str = '{ "key1": 1, key2 : {aa:1, bb:{}}, key3:a,key4:[1,2], key5:function(){return 1;}, key6:()=>{return 2;} }';

转化结果:
image.png

如上,我有一个非标准的json字符串(不换行),里面每个键的值可能是字母、数字、对象、函数,在不能使用eval和new Function的前提下,请问怎么转换为对象(如图所示),最好是函数是function还是箭头函数也能区分。

我初步想法是先转化为标准json对象
变成:'{ "key1": 1, "key2" : {"aa":1, "bb":{}}, "key3":"v","key4":[1,2], "key5":"function(){return 1;}", "key6":"()=>{return 2;}" }';
再JSON.parse

第一步:先提取出第一层数据,第二步:按冒号分割键和值,第三步:根据值的类型做不同处理
"key1": 1 值为数字,不处理
key2 : {aa:1,bb:{}} 值为对象,继续第一步
key3:a 值为字母,加引号
key4:[1,2] 值为数组,继续第一步
key5:function(){return 1;} 值为方法,加双引号
key6:()=>{return 2;} 值为方法,加双引号

现在的问题就变成了怎么根据逗号分割出最外层数据?

阅读 2.6k
2 个回答

刚看问题描述没看懂要干什么,看了评论大概猜测是想实现微信小程序里动态下发js代码。

https://developers.weixin.qq....

微信官方发现一个就会下架一个。
如果只是单纯想研究技术实现,上面的链接里给出的“违规”库如estime等应该就是你要的

本质上是一个编译原理的范畴,如果需求比较简单的话,可以自己设计一个DSL来更新一些简单的逻辑

没有微信小程序的开发环境,没有办法帮你试,不知道微信小程序的setTimeout可不可以,以下代码在浏览器可以通过,在字符串前加下变量定义就可以,你自己试试,我估计也是不行的,但是没准呢,如果下面代码可以通过,哪就有办法可想了,不然想当于自己写javascript解释器了

let str = 'var a={ key1: 1, key2 : {aa:1, bb:{}}, key3:a,key4:[1,2], key5:function(){return 1;}, key6:()=>{return 2;} }';

function ExecuteJavascriptString()
{
    setTimeout(str, 1)
}
ExecuteJavascriptString()
setTimeout(()=>{
  console.log(a)
},2)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏