将此绑定到JSON.parse()

时间:2017-11-08 06:33:04

标签: javascript json

我有一个案例需要通过绑定这个来解析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)替换为实际值。

3 个答案:

答案 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