mj_*_*mj_ 246 javascript json deserialization
我在使用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"
}];
Run Code Online (Sandbox Code Playgroud)
当字符串从服务器中拉出时,是否有一种简单的方法可以将其转换为活动的JavaScript对象(或数组)?或者我是否必须手动拆分字符串并手动构建我的对象?
use*_*716 384
现代浏览器支持JSON.parse().
var arr_from_json = JSON.parse( json_string );
Run Code Online (Sandbox Code Playgroud)
在不浏览器,您可以包括在json2库中.
Abh*_*nav 24
JSON的重点是JSON字符串可以转换为本机对象而无需执行任何操作.检查此链接
你可以使用eval(string)或JSON.parse(string).
但是,eval风险很大.来自json.org:
eval功能非常快.但是,它可以编译和执行任何JavaScript程序,因此可能存在安全问题.当源是可信的并且胜任时,指示使用eval.使用JSON解析器更安全.在基于XMLHttpRequest的Web应用程序中,只允许与提供该页面的同一源进行通信,因此它是可信的.但它可能没有能力.如果服务器的JSON编码不严格,或者它没有严格验证其所有输入,那么它可能会传送可能带有危险脚本的无效JSON文本.eval函数将执行脚本,释放其恶意.
Rav*_*afi 15
像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);
Run Code Online (Sandbox Code Playgroud)
这样您就不需要任何外部库,它仍然适用于旧浏览器.
收集数组的所有项并返回一个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;
},
Run Code Online (Sandbox Code Playgroud)
解析我们经历的相同数据
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)
});
});
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用eval()但JSON.parse()更安全、更简单的方法,那为什么要使用呢?
好用
var yourJsonObject = JSON.parse(json_as_text);
Run Code Online (Sandbox Code Playgroud)
我看不出有什么理由让您更喜欢使用eval. 它只会使您的应用程序处于危险之中。
这就是说-这是也是可能的。
坏 - 但也有效
var yourJsonObject = eval(json_as_text);
Run Code Online (Sandbox Code Playgroud)
为什么是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"
}]
`;
Run Code Online (Sandbox Code Playgroud)
您的服务器端脚本处理该数据。
使用JSON.parse:
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo;
}
Run Code Online (Sandbox Code Playgroud)
会抛出:
Uncaught SyntaxError: Unexpected token u in JSON at position X.
Run Code Online (Sandbox Code Playgroud)
函数不会被执行。
你很安全。
使用eval():
window.onload = function(){
var placeholder = document.getElementById('placeholder1');
placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo;
}
Run Code Online (Sandbox Code Playgroud)
将执行函数并返回文本。
如果您在服务器端运行它,我将这个无害的功能替换为一个,从您的网站文件夹中删除文件或做一些有害的事情,那么您的应用程序将被黑客入侵。在这个例子中不会抛出任何错误/警告。
你不安全。
我能够操作 JSON 文本字符串,因此它充当将在服务器上执行的函数。
eval(JSON)[0].adjacencies[0].nodeTo 期望处理一个 JSON 字符串,但实际上,我们只是在我们的服务器上执行了一个函数。
如果我们在将用户提供的所有数据传递给eval()函数之前检查所有用户提供的数据,也可以防止这种情况发生,但为什么不使用内置工具来解析 JSON 并避免所有这些麻烦和危险呢?
| 归档时间: |
|
| 查看次数: |
313476 次 |
| 最近记录: |