我使用jQuery.ajax()解析从我的服务器返回的一些JSON数据时遇到困难
要执行我正在使用的AJAX:
$.ajax({ url: myUrl, cache: false, dataType: "json", success: function(data){ ... }, error: function(e, xhr){ ... } });
如果我返回一个项目数组,那么它工作正常:
[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]
调用success函数并接收正确的对象.
但是,当我尝试返回单个对象时:
{ title: "One", key: "1" }
调用错误函数,xhr包含'parsererror'.我已经尝试将JSON包装在服务器上的括号中,然后再将其发送到网络中,但它没有任何区别.然而,如果我将内容粘贴到Javascript中的字符串中然后使用eval()函数,它会完美地评估它.
我有什么想法我做错了吗?
安东尼
您的服务器是否将数据作为Content-Type发送"*/json"
?如果没有,请相应地修改响应标头."application/json"
例如,发送会很好.
根据json.org规范,您的返回无效.这些名字总是被引用,所以你应该回来
{ "title": "One", "key": "1" }
和
[ { "title": "One", "key": "1" }, { "title": "Two", "key": "2" } ]
这可能不是您的设置的问题,因为您说其中一个现在可以正常工作,但是如果您将来需要切换到另一个JSON解析器,则应该修复它的正确性.
JSON字符串用双引号括起来; 单引号不是有效的替代品.
{"who": "Hello World"}
是有效的,但这不是......
{'who': 'Hello World'}
虽然不是OP的问题,但是认为值得注意的是其他人来到这里.
此问题通常是因为您的请求收到了错误的mime类型.在您自己的计算机上进行开发时,有时您没有从"服务器"(即您自己的计算机)接收正确的mime类型.通过在浏览器中打开本地存储的文件进行开发时遇到了这个问题(例如,url是"c:/project/test.html").
尝试使用beforeSend属性添加一个覆盖mime类型的回调函数.尽管服务器发送了错误的mime类型并且你的调用代码收到了错误的mime类型,但这会欺骗代码处理json.下面是一些示例代码.
根据这个问题,适当的mime类型是application/json ,但我确实知道应用程序/ j-son在我尝试时工作(现在几年前).您应该首先尝试application/json.
var jsonMimeType = "application/json;charset=UTF-8"; $.ajax({ type: "GET", url: myURL, beforeSend: function(x) { if(x && x.overrideMimeType) { x.overrideMimeType(jsonMimeType); } }, dataType: "json", success: function(data){ // do stuff... } });
我有这个问题,而且我使用了一点
eval('('+data+')')
获取对象中返回的数据.但后来有其他问题在括号中出现'缺失'错误,并发现jQuery有一个专门用于评估json结构字符串的函数:
$.parseJSON(data)
应该做的伎俩.这是除了让你的json字符串以正确的格式当然..
如果您正在回显json响应并且您的标头与*/json不匹配,那么您可以使用内置的jQuery.parseJSON api来解析响应.
response = '{"name":"John"}'; var obj = jQuery.parseJSON(response); alert( obj.name === "John" );