将 JSON 反序列化为 JavaScript 对象

IT技术 javascript json deserialization
2021-01-12 08:52:35

我在使用 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 对象(或数组)?还是我必须手动拆分字符串并手动构建我的对象?

6个回答

现代浏览器支持JSON.parse().

var arr_from_json = JSON.parse( json_string );

在不浏览器,您可以包括json2库中

或 Map() 对象等,您如何进行正确的反序列化
2021-03-18 08:52:35
这将如何用于 JSON 中的日期字段,例如 {StartDate: "\/Date(1372575600000)\/"}?
2021-03-21 08:52:35
@PhilippMunin 您可以使用 javascript API 中的此日期函数: new Date(parseInt("/Date(946681200000)/".replace('/Date(', '')));
2021-04-09 08:52:35

JSON 的全部意义在于可以将 JSON 字符串转换为本地对象,而无需执行任何操作。检查此链接

您可以使用eval(string)JSON.parse(string)

然而,eval是有风险的。来自 json.org:

eval 函数非常快。但是,它可以编译和执行任何 JavaScript 程序,因此可能存在安全问题。当来源可信且有能力时,表明使用 eval。使用 JSON 解析器要安全得多。在通过 XMLHttpRequest 的 Web 应用程序中,只允许与提供该页面的同一来源进行通信,因此它是可信的。但它可能无法胜任。如果服务器在其 JSON 编码方面不严格,或者如果它没有严格验证所有输入,那么它可能会传递可能带有危险脚本的无效 JSON 文本。eval 函数将执行脚本,释放其恶意。

@xr280xr 是的,但这仅发生在他们的浏览器本地,而不是每个下载网站的浏览器。
2021-03-16 08:52:35
我不明白风险。任何人都不能使用 js 调试器来注入和执行他们想要的任何脚本吗?
2021-04-08 08:52:35

像 jQuery 那样做!(精华)

function parseJSON(data) {
    return window.JSON && window.JSON.parse ? window.JSON.parse( data ) : (new Function("return " + data))(); 
}
// testing
obj = parseJSON('{"name":"John"}');
alert(obj.name);

这样你就不需要任何外部库,它仍然适用于旧浏览器。

这是危险的,eval 是邪恶的!
2021-03-25 08:52:35
这看起来像是回落到相当于eval().
2021-04-06 08:52:35

收集数组的所有项目并返回一个 json 对象

collectData: function (arrayElements) {

        var main = [];

        for (var i = 0; i < arrayElements.length; i++) {
            var data = {};
            this.e = arrayElements[i];            
            data.text = arrayElements[i].text;
            data.val = arrayElements[i].value;
            main[i] = data;
        }
        return main;
    },

解析我们这样经历的相同数据

dummyParse: function (json) {       
        var o = JSON.parse(json); //conerted the string into JSON object        
        $.each(o, function () {
            inner = this;
            $.each(inner, function (index) {
                alert(this.text)
            });
        });

}

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

这次真是万分感谢。我相信这是 OWASP Web 应用程序风险中的 #8,反序列化。
2021-03-30 08:52:35