解析复杂的JSON Javascript
我能够用JSON.parse解析返回简单数据的JSON,但在处理返回对象、日期、字符串等的数据时遇到了问题解析复杂的JSON Javascript,javascript,Javascript,我能够用JSON.parse解析返回简单数据的JSON,但在处理返回对象、日期、字符串等的数据时遇到了问题 var theData=JSON.parse(theData); 类似这样的JSON.parse返回的[Object]对象完全没有数据(我可以看到数据正在成功返回,因为如果我关闭了JSON.parse,它将以字符串形式返回所有数据) 用javascript解析这些数据的最佳方法是什么(我不能使用jquery) 注意:我编写的JSON假设其有效 这是我用来检索数据的代码 var xhReq
var theData=JSON.parse(theData);
类似这样的JSON.parse返回的[Object]对象完全没有数据(我可以看到数据正在成功返回,因为如果我关闭了JSON.parse,它将以字符串形式返回所有数据)
用javascript解析这些数据的最佳方法是什么(我不能使用jquery)
注意:我编写的JSON假设其有效
这是我用来检索数据的代码
var xhReq = new XMLHttpRequest();
xhReq.open("POST", "ClientService.svc/REST/GetDetail", false);
xhReq.send(null);
var serverResponse = xhReq.responseText;
alert(serverResponse);
return serverResponse;
您的JSON格式错误,数据必须是字符串 因此,这将起作用(为了提高可读性,我打断了这些行): 当然,如果使用简单引号作为字符串分隔符,则代码为:
var data = '{' +
' "AppName": "TheName", ' +
' "AppUrl": "https:\/\/app\/icons\/unknown.png", ' +
' "aGUID": "45c055d2-2edc-d4444", ' +
' "DateCreated": "8\/23\/2012 11:04AM", ' +
' "foo": { ' +
' "ID": "yser123", ' +
' "Name":"User"' +
' }' +
'}';
此不起作用:
var data = "{" +
" 'AppName': 'TheName', " +
" 'AppUrl': 'https:\/\/app\/icons\/unknown.png', " +
" 'aGUID': '45c055d2-2edc-d4444', " +
" 'DateCreated': '8\/23\/2012 11:04AM', " +
" 'foo': { " +
" 'ID': 'yser123', " +
" 'Name': 'User'" +
" }" +
"}";
jsiddle:首先。将JavaScript重写为异步
function getDetail(cb) {
var xhReq = new XMLHttpRequest();
xhReq.open("POST", "ClientService.svc/REST/GetDetail", true);
xhReq.onreadystatechange = function() {
if (xhReq.readyState == 4) cb(xhReq.responseText);
}
xhReq.send(null);
}
// to call:
getDetail(function(data) {
JSON.parse(data);
}
其次,您的问题不是JSON被错误地解析。这是对警报的调试调用。当您传递serverResponse
对象时,alert
通过调用对象的toString
方法将对象强制为字符串,该方法只返回'[object object]'
尝试console.log
。可以在控制台中检查对象。实际上,这听起来像是在工作。如果你把这样的事情叫做:
alert(JSON.parse(serverResponse))
它将显示正确的[object]。如果你打电话
alert(JSON.parse(serverResponse).appName)
您应该看到appName。如果没有看到抛出“SyntaxError”,则JSON.parse()正在工作您发布的特定字符串是无效的JSON。结尾缺少一个“
字符。否则JSON.parse()
将处理任何事情(这是有效的JSON)。为什么要跳过?”/“?@david这就是返回的方式是的,它需要是有效的JSON。这里有一个很好的资源来检查你的JSON是否有效:如果你不发布准确的信息,人们很难帮助你。JSON.parse()
机制将解析任何类型的JSON结构,不管它有多复杂,直到它开始耗尽内存为止。您的示例JSON绝对不是太大。当然,您应该在浏览器控制台中检查错误。如果可以将双引号括在单引号中,为什么要将其转义…?我使用的JSON是由C#从实际的.Net对象创建的,我无法控制创建的JSON。我在问题中输入的示例JSON可能无效(可能缺少引号),因为我是出于示例目的手工编写的。有没有可能.Net把返回的JSON搞砸了?应该引用前斜杠,尽管我同意这似乎是不必要的。我认为JSON.parse()
不会坚持使用它,但它绝对有效。@NickLaMarca,我觉得很奇怪。您使用的是什么.NET库?我总是不得不使用JSON.Net,但是有一些集成选项。你能粘贴.Net端的输出吗?@Pointy:嗨!谢谢你的建议。我从未注意到:S,但正如你所说的,解析器不会对此抱怨。我更新了我的答案以逃避“/”。哇哦,这当然减少了很多噪音:-)为什么我不能使用同步XHR?@NickLaMarca:通常,同步XHR是一个主要的禁忌。有细节,但最重要的是。
alert(JSON.parse(serverResponse))
alert(JSON.parse(serverResponse).appName)