我有一个案例需要通过绑定这个来解析JS对象中的字符串,如下所示:
var jsString = '{"name" : this.name, "age": this.age}';
this.name = "Hello";
this.age = 100;
//This fails(CASE 1)
var jsObjectFromString = JSON.parse(jsString);
console.log(jsObjectFromString );
//This works(CASE 2)
var directObject = {"name" : this.name, "age": this.age};
console.log(directObject);
//Need below output for console.log(jsObjectFromString ):
//{"name" : "Hello", "age": 100}
在我的实际程序中,字符串来自网络服务&因此我不能使用CASE 2方法。
我可以遍历JS对象&解析后设置params如下:
var jsonString = '{"name" : "", "age": 0}';
var jsonObject = JSON.parse(jsonString);
jsonObject["name"] = this.name;
jsonObject["age"] = this.age;
但是有很多内在的对象和遍历将是一次杀戮。我尝试了以下但失败了(显然:():
JSON.parse(jsonString).bind(this);
有没有办法克服这个问题?
PS:这是一个基于浏览器的应用程序,而不是节点项目。
编辑:我想从字符串构造一个javascript对象。我想在解析的Javascript对象中将部分字符串(如name,age)替换为实际值。
答案 0 :(得分:0)
您可以做的最好的事情是生成有效的JSON。这是一个例子:
function preProcess(invalidJSON){
this.name = "Hello";
this.age = 100;
Object.keys(this).forEach(key => {
invalidJSON = invalidJSON.replace(new RegExp("this\\." + key, "g"), '"'+this[key]+'"');
});
// replace all non-existing properties with empty values.
var validJSON = invalidJSON.replace(/this\.[^,\[\]\{\}]+/, '""');
return validJSON;
}
var str = '{"name" : this.name, "age": this.age}';
var validJSON = preProcess.call({}, str);
console.log(validJSON);
答案 1 :(得分:0)
这是一个非常奇怪的用例,我确信你的应用程序的设计应该改变。但是这里是基于允许属性白名单的解决方案和特定角色“this”的协议。初始字符串中的子字符串:
let income = '{"name" : this.name, "age": this.age}';
this.name = "Hello";
this.age = 100;
const whiteList = ['name', 'age'];
const inject = (prop) => {
if(typeof this[prop] === 'string') {
return '"' + this[prop] + '"';
}
return this[prop];
};
whiteList.forEach(prop => income = income.replace('this.' + prop, inject(prop)));
console.log(income); // {"name" : "Hello", "age": 100}
您可以通过
升级程序': this.'
答案 2 :(得分:0)
正如@Soren对评论所说,'{"name" : this.name, "age": this.age}'
不是有效的JSON
字符串。
您实际想要做的是在JSON中传递表达式而不是值,并对它们进行评估。您可以考虑的第一件事是使用eval()
,在大多数情况下,这是一个坏主意(一篇不错的文章here)。
另一个选项,也许更合适,是使用自定义标记来标识要评估的表达式,将其替换为您的值,然后将获取的字符串解析为JSON:
来自此字符串的 '{"name" : |name|, "age": |age|}'
,您可以查找任何|...|
次出现,并使用|
符号(您的自定义标记标记)中的内容作为任何对象内的键,在您的案例this[whateverYouFound]
。
现在,您可以将原始字符串中的找到值替换为'{"name" : "hello", "age": 100}'
(如果需要,甚至可以对对象进行字符串化),这是一个有效的JSON字符串。
这种方法可以避免将这种可能性暴露给evaluate dangerous code