Javascript angular.fromJson与$scope.$eval之间的差异(当应用于JSON字符串时)
在我的angularjs应用程序中,我通常使用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);
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
- 使用
解析JSON字符串时是否存在任何可能的问题$scope.$eval
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字符串时是否存在任何可能的问题?对不起,我认为答案是隐式的。我将再次更新我的回复。;)