如何解决将用户输入字符串转换为要由函数访问的对象
我有(输入)格式的数据:
doSomething({
type: 'type',Unit: 'unit',attributes: [
{
attribute: 'attribute',value: form.first_name
},{
attribute: 'attribute2',value: form.family_name
}
],groups: [
{
smth: 'string1',smth2: 'string2',start: timeStart.substring(0,9)
}
]
})
我设法用括号将doSomething部分取出来从相应的模块加载函数
expression.split('({',1)[0]
但是将加载的函数与其余函数一起使用,可以通过以下方式获得:
expression.split(temp+'(')[1].trim().replace(/\n+/g,'').slice(0,-1)
不起作用,因为它应该是一个对象而不是字符串。对数据进行硬编码确实可以正常工作,因为它会自动作为对象读取。
我的问题是,是否有任何方法可以将我从用户那里获得的字符串转换为对象。我曾尝试使用JSON.parse将其转换为json对象,但在位置3处出现意外字符t。我也尝试了new Object(myString),但该方法也不起作用。
我想要的是将提供的函数的主体作为对象,就像我要对其进行硬编码一样,以便该函数可以正确地评估不同的字段。 有什么方法可以轻松实现这一目标?
编辑:“输出”为:
{
type: 'type',9)
}
]
}
作为对象。这是关键部分,因为我已经有这个字符串了。但是使用此功能的函数期望一个对象。如前所述,硬编码可以工作,因为它是作为对象读取的,但是我从用户那里获得了上述输入作为字符串。
解决方法
除了:我知道评估是邪恶的。用户可以通过某些注射来完成。 。
我刚刚在“输出=”之前添加了一个字符串,从输入字符串中删去了“ doSomething(”和最后一个“)”。这样,我有了一个普通的命令行,可以通过eval执行。
我强烈不推荐以这种方式使用eval;特别是你不 知道用户会做什么,所以您不知道会发生什么 与您的代码和数据。
let form = {first_name: 'Mickey',family_name: 'Mouse'};
let timeStart = (new Date()).toString();
let input = `doSomething({
type: 'type',Unit: 'unit',attributes: [
{
attribute: 'attribute',value: form.first_name
},{
attribute: 'attribute2',value: form.family_name
}
],groups: [
{
smth: 'string1',smth2: 'string2',start: timeStart.substring(0,9)
}
]
})`;
let pos= "doSomething(".length;
input = 'output = ' + input.substr(pos,input.length-pos-1);
eval(input);
console.log(output);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。