您也可以使用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 并避免所有这些麻烦和危险呢?