解析复杂的JSON Javascript

解析复杂的JSON Javascript,javascript,Javascript,我能够用JSON.parse解析返回简单数据的JSON,但在处理返回对象、日期、字符串等的数据时遇到了问题 var theData=JSON.parse(theData); 类似这样的JSON.parse返回的[Object]对象完全没有数据(我可以看到数据正在成功返回,因为如果我关闭了JSON.parse,它将以字符串形式返回所有数据) 用javascript解析这些数据的最佳方法是什么(我不能使用jquery) 注意:我编写的JSON假设其有效 这是我用来检索数据的代码 var xhReq

我能够用JSON.parse解析返回简单数据的JSON,但在处理返回对象、日期、字符串等的数据时遇到了问题

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)