我在一个使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来如下所示:
var json = [{
"adjacencies": [
{
"nodeTo": "graphnode2",
"nodeFrom": "graphnode1",
"data": {
"$color": "#557EAA"
}
}
],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode1",
"name": "graphnode1"
},{
"adjacencies": [],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode2",
"name": "graphnode2"
}];
当字符串从服务器拉出来时,是否有一种简单的方法将其转换为活的JavaScript对象(或数组)?或者我必须手动分割字符串并手动构建我的对象?
您也可以使用eval(),但JSON.parse()是更安全、更简单的方式,那么为什么要这样做呢?
好并且有效
var yourJsonObject = JSON.parse(json_as_text);
我看不出你为什么更喜欢用eval。这只会使您的应用程序处于危险之中。
也就是说,这也是可能的。
不好——但也有用
var yourJsonObject = eval(json_as_text);
为什么eval是一个坏主意?
考虑下面的例子。
某些第三方或用户提供了JSON字符串数据。
var json = `
[{
"adjacencies": [
{
"nodeTo": function(){
return "delete server files - you have been hacked!";
}(),
"nodeFrom": "graphnode1",
"data": {
"$color": "#557EAA"
}
}
],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode1",
"name": "graphnode1"
},{
"adjacencies": [],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode2",
"name": "graphnode2"
}]
`;
服务器端脚本处理这些数据。
使用JSON.parse:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
将把:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
函数将不会被执行。
你是安全的。
使用eval ():
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
将执行函数并返回文本。
如果你在服务器端运行这个,我将这个无害的函数替换为一个,从你的网站文件夹中删除文件或做一些有害的事情,那么你的应用程序将被黑客入侵。在本例中不会抛出错误/警告。
你不安全。
我能够操作JSON文本字符串,因此它作为一个函数,将在服务器上执行。
eval (JSON) [0] .adjacencies[0]。nodeTo期望处理JSON字符串,但实际上,我们只是在服务器上执行了一个函数。
如果我们在将数据传递给eval()函数之前在服务器端检查所有用户提供的数据,也可以避免这种情况,但为什么不直接使用内置工具来解析JSON,从而避免所有这些麻烦和危险呢?