我在Java服务器应用程序中有一个使用AJAX访问的字符串。它看起来像下面这样:
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对象(或数组)?或者我是否必须手动拆分字符串并手动构建我的对象?
答案 0 :(得分:372)
现代浏览器支持JSON.parse()
。
var arr_from_json = JSON.parse( json_string );
在没有的浏览器中,您可以添加the json2
library。
答案 1 :(得分:24)
JSON的重点是JSON字符串可以转换为本机对象而无需执行任何操作。请检查此link
您可以使用eval(string)
或JSON.parse(string)
。
然而,eval
存在风险。来自json.org:
eval功能非常快。 但是,它可以编译和执行任何JavaScript程序, 所以可能存在安全问题。 当源是可信的并且胜任时,指示使用eval。 使用JSON解析器更安全。 在XMLHttpRequest的Web应用程序中, 只允许与同一来源进行通信 提供该页面,因此它是值得信赖的。 但它可能没有能力。 如果服务器的JSON编码不严谨, 或者如果它没有严格验证其所有输入, 然后它可能会传送无效的JSON文本,可能携带危险的脚本。 eval函数将执行脚本,释放它的恶意。
答案 2 :(得分: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);
这样您就不需要任何外部库,它仍适用于旧浏览器。
答案 3 :(得分:7)
收集数组的所有项并返回一个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)
});
});
}
答案 4 :(得分:3)
您也可以使用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并避免所有这些麻烦和危险?
答案 5 :(得分:1)
如果您还希望反序列化对象具有函数,则可以使用我的小工具:https://github.com/khayll/jsmix
//first you'll need to define your model
var GraphNode = function() {};
GraphNode.prototype.getType = function() {
return this.$type;
}
var Adjacency = function() {};
Adjacency.prototype.getData =n function() {
return this.data;
}
//then you could say:
var result = JSMix(jsonData)
.withObject(GraphNode.prototype, "*")
.withObject(Adjacency.prototype, "*.adjacencies")
.build();
//and use them
console.log(result[1][0].getData());
答案 6 :(得分:0)
如果将服务器端的字符串粘贴到html中,则无需执行任何操作:
对于jsp中的普通java:
var jsonObj=<%=jsonStringInJavaServlet%>;
对于jsp width struts:
var jsonObj=<s:property value="jsonStringInJavaServlet" escape="false" escapeHtml="false"/>;
答案 7 :(得分:-3)
我认为这应该有所帮助:
此外,文档还证明您可以对json文件使用require(): https://www.bennadel.com/blog/2908-you-can-use-require-to-load-json-javascript-object-notation-files-in-node-js.htm
var jsonfile = require("./path/to/jsonfile.json");
node = jsonfile.adjacencies.nodeTo;
node2 = jsonfile.adjacencies.nodeFrom;
node3 = jsonfile.adjacencies.data.$color;
//other things.