应用于JSON字符串时angular.fromJson和$ scope。$ eval之间的差异

时间:2015-03-24 22:11:56

标签: javascript json angularjs

在我的angularjs应用程序中,我通常使用angular.fromJson解析JSON字符串,如下所示:

var myObject=angular.fromJSON(jsonString);

但是,似乎我会使用$scope.$eval

获得相同的结果
var myObject=$scope.$eval(jsonString);

See this fiddle

或者使用vanilla javaScript,如下所示:

var myObject=JSON.parse(jsonString);
  • 使用angular.fromJSON而不是JSON.parse是否有任何特殊原因?

  • 使用$scope.$eval解析JSON字符串时是否存在任何问题?

2 个答案:

答案 0 :(得分:32)

查看source code

function fromJson(json) {
  return isString(json)
      ? JSON.parse(json)
      : json;
}

他们只是传递给JSON.parse

至于$eval,它会发送到$parse

  // $scope.$eval source:
  $eval: function(expr, locals) {
    return $parse(expr)(this, locals);
  },

$ parse source太长而无法发布,但它基本上能够将内联(字符串化)对象转换为真正的对象,所以在这种情况下它实际上会转换你的JSON是有意义的同样。

(直到刚读完$ parse来源我才知道这个。)

  

有没有特别的理由使用angular.fromJSON而不是JSON.parse?

不,不是真的。虽然他们会检查您,以确保您不会对JSON字符串进行双重解析,如下所示:

var jsonString = '{"foo":"bar"}';
var json = JSON.parse(jsonString); // Parsing once is good :)
JSON.parse(json); // Parsing twice is bad :(
  

使用$ scope。$ eval解析JSON字符串时是否存在任何问题?

除了你做的工作超出必要时,我不会这么想。因此,如果您知道自己拥有JSON,则没有理由使用较重的$ parse函数。

答案 1 :(得分:4)

上述答案几乎是正确的。但是, 是使用$scope.$eval()解析JSON字符串的潜在问题,{J}字符串与JSON.parse()angular.fromJson():安全性不存在。 Angular允许表达式包含复杂的JavaScript,包括函数调用,带?:的条件,变量赋值等。如果您使用$scope.$eval(),即使它们是由恶意最终用户添加的,也会识别并处理所有这些内容。

JSON不支持任何更复杂的JavaScript功能,也不支持其他任何可能“危险”的功能。如果您使用真正的JSON解析器,如JSON.parse()angular.fromJson(),则不会注入和执行恶意代码。

由于Angular表达式是孤立的并仅在当前$scope中进行评估,因此代码注入的风险有所减轻 - $scope.$eval()远比JavaScript的本机eval()更难以解析JSON。但是仍然没有理由为此目的使用任何一个函数,因为存在潜在的安全风险使用适当的JSON解析器可能会更快。