Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript angular.fromJson与$scope.$eval之间的差异(当应用于JSON字符串时)_Javascript_Json_Angularjs - Fatal编程技术网

Javascript angular.fromJson与$scope.$eval之间的差异(当应用于JSON字符串时)

Javascript angular.fromJson与$scope.$eval之间的差异(当应用于JSON字符串时),javascript,json,angularjs,Javascript,Json,Angularjs,在我的angularjs应用程序中,我通常使用angular.fromJson解析JSON字符串,如下所示: var myObject=angular.fromJSON(jsonString); var myObject=JSON.parse(jsonString); var jsonString = '{"foo":"bar"}'; var json = JSON.parse(jsonString); // Parsing once is good :) JSON.parse(json);

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

var myObject=angular.fromJSON(jsonString);
var myObject=JSON.parse(jsonString);
var jsonString = '{"foo":"bar"}';
var json = JSON.parse(jsonString); // Parsing once is good :)
JSON.parse(json); // Parsing twice is bad :(
但是,我似乎可以通过使用
$scope.$eval
获得相同的结果:

var myObject=$scope.$eval(jsonString);

或者使用普通javaScript,如下所示:

var myObject=angular.fromJSON(jsonString);
var myObject=JSON.parse(jsonString);
var jsonString = '{"foo":"bar"}';
var json = JSON.parse(jsonString); // Parsing once is good :)
JSON.parse(json); // Parsing twice is bad :(
  • 使用
    angular.fromJSON
    而不是
    JSON.parse
    有什么特别的原因吗

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

查看以下内容:

它们只是传递到
JSON.parse

至于它的作用是:

$parse source太长,无法发布,但它基本上能够将内联(stringized)对象转换为真实对象,因此在这种情况下,它实际上也会转换JSON

(直到刚才阅读$parse源代码,我才知道这一点。)

使用angular.fromJSON而不是JSON.parse有什么特别的原因吗

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

var myObject=angular.fromJSON(jsonString);
var myObject=JSON.parse(jsonString);
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函数。

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

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


由于角度表达式是孤立的,并且只在当前的
$scope
中进行计算,因此代码注入的风险在某种程度上得到了缓解-
$scope.$eval()
对于解析JSON来说远没有JavaScript的本机
eval()
危险。但是,仍然没有理由为此使用这两个函数,因为存在潜在的安全风险,并且使用适当的JSON解析器可能会更快。

但是在性能方面存在一些(轻微)差异。
$scope.$eval
用于评估JavaScript表达式。如果您尝试评估JSON,您将得到一个错误。它似乎评估JSON并返回一个对象:请检查fiddle Iprovided@brianvaughn,谢谢你对这篇文章感兴趣。你表现出了努力,我愿意接受你的回答:)但是,你还没有真正回答文章末尾的问题,即:使用angular.fromJSON而不是JSON.parse有什么特别的原因吗?使用$scope.$eval解析JSON字符串时是否存在任何可能的问题?对不起,我认为答案是隐式的。我将再次更新我的回复。;)