jQuery不会从AJAX查询parsing我的JSON

我有困难的parsing从我的服务器使用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" } ] 

成功函数被调用并接收正确的对象。

但是,当我试图返回一个单一的对象:

 { title: "One", key: "1" } 

错误函数被调用,xhr包含“parsererror”。 我已经尝试在服务器上的括号中包装JSON,然后将其发送到电线上,但没有任何区别。 然而,如果我把这些内容粘贴到Javascript中的一个string中,然后使用eval()函数,它就可以完美地评估它。

任何想法我做错了什么?

安东尼

您的服务器是否以Content-Type "*/json"发送数据? 如果不是,请相应地修改响应标头。 例如,发送"application/json"就没有问题。

根据json.org规范,你的回报是无效的。 名字总是引用,所以你应该回来

 { "title": "One", "key": "1" } 

 [ { "title": "One", "key": "1" }, { "title": "Two", "key": "2" } ] 

这可能不是你的设置的问题,因为你说其中一个现在可以工作,但它应该是正确的,以防将来需要切换到另一个JSONparsing器。

JSONstring用引号括起来; 单引号不是有效的替代品。

 {"who": "Hello World"} 

是有效的,但这不是…

 {'who': 'Hello World'} 

虽然不是OP的问题,但认为值得注意的是其他人登陆这里。

这个问题通常是因为你的请求收到了错误的MIMEtypes。 在您自己的计算机上开发时,有时候您没有从“服务器”(这是您自己的计算机)接收适当的MIMEtypes。 我通过在浏览器中打开本地存储的文件(例如url为“c:/project/test.html”)进行开发时遇到了这个问题。

尝试使用beforeSend属性添加覆盖MIMEtypes的callback函数。 这将欺骗代码来处理json,尽pipe服务器发送了错误的MIMEtypes,并由您的调用代码接收。 下面是一些示例代码。

根据这个问题 ,适当的mimetypes是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+')') 

获取对象中返回的数据。 但后来有其他问题得到一个“缺less)在括号”错误,并发现jQuery有一个专门为json结构评估string的函数:

 $.parseJSON(data) 

应该做的伎俩。 这是除了让你的JSONstring在正确的格式当然..

如果你回应json响应和你的头不匹配* / json那么你可以使用内置的jQuery.parseJSON apiparsing响应。

 response = '{"name":"John"}'; var obj = jQuery.parseJSON(response); alert( obj.name === "John" ); 
 { title: "One", key: "1" } 

不是你所想的 作为一个expression式,它是一个对象字面值,但是作为一个声明,它是:

 { // new block title: // define a label called 'title' for goto statements "One", // statement: the start of an expression which will be ignored key: // ...er, what? you can't have a goto label in the middle of an expression // ERROR 

不幸的是,eval()并没有给你一个方法来指定是否给它一个语句或expression式,而且往往会猜错。

通常的解决scheme确实是在将任何东西发送到eval()函数之前将其放在括号中。 你说你已经尝试过在服务器上…显然不知道怎么办。 在客户端应该防水,无论接受XMLHttpRequest响应:

 eval('('+responseText+')'); 

代替:

 eval(responseText); 

只要答案真的是一个expression式而不是一个陈述。 (例如,它没有多个分号或换行符分隔的子句)。

如果您使用jQuery使用ASP.NET Web服务,请确保您的web.config中包含以下内容:

 <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> </protocols> </webServices> 

我有一个类似的问题,在这里火狐3.5工作正常,并parsing我的JSON数据,但Firefox 3.0.6返回一个parseerror。 原来,这是JSON开始的一个空白,导致Firefox 3.0.6抛出一个错误。 删除空白处固定它

你将不得不在PHP中设置标题内容types如下:

  <?php header('Content-type:application/json'); ?> 

观看这些video更好的理解….

参考: http : //www.youtube.com/watch?v = EvFXWqEqh6o

技术“eval()”和“JSON.parse()”使用互斥的格式。

  • 用“eval()”括号是必需的
  • 用“JSON.parse()”括号是禁止的

请注意,有“stringify()”函数产生“eval”格式。 对于ajax,您应该只使用JSON格式。

虽然“eval”包含了整个JavaScript语言,但JSON只使用该语言的一小部分。 在JavaScript语言中,“eval”必须承认的构造是“块语句”(又名“复合语句”) ; 这是一对或大括号“{}”与里面的一些陈述。 但是花括号也用在对象文字的语法中。 解释是由代码出现的上下文来区分的。 东西可能看起来像一个对象字面给你,但“eval”将它看作一个复合语句。

在JavaScript语言中,对象文字出现在赋值的右侧。

 var myObj = { ...some..code..here... }; 

对象文字不会自行发生。

 { ...some..code..here... } // this looks like a compound statement 

回到OP最初的问题,在2008年被问到,他问为什么在eval()中失败了:

 { title: "One", key: "1" } 

答案是,它看起来像一个复合语句。 为了把它转换成一个对象,你必须把它放到一个复合语句不可能的上下文中。 这是通过把括号括起来

 ( { title: "One", key: "1" } ) // not a compound statment, so must be object literal 

OP还询问为什么类似的声明成功评估:

 [ { title: "One", key: "1" }, { title: "Two", key: "2" } ] 

同样的答案适用 – 花括号是在复合语句不可能的情况下。 这是一个数组上下文,“ [...] ”,数组可以包含对象,但不能包含语句。

与“eval()”不同,JSON的function非常有限。 限制是有意的。 JSON的devise者打算使用一个简约的JavaScript子集,只使用可能出现在作业右侧的语法。 所以如果你有一些在JSON中正确parsing的代码…

 var myVar = JSON.parse("...some...code...here..."); 

…这意味着它也将在法律上的任务的右侧parsing,就像这样..

 var myVar = ...some..code..here... ; 

但这不是JSON的唯一限制。 JSON的BNF语言规范非常简单。 例如,它不允许使用单引号来表示string(如JavaScript和Perl),并且它没有办法将单个字符表示为字节(如'C')。 不幸的是,它也不允许注释(这在创buildconfiguration文件时会非常好)。 所有这些限制的优点是parsingJSON是快速的,并且不提供代码注入(安全威胁)的机会。

由于这些限制,JSON对括号没有用处。 因此,JSONstring中的括号是非法字符。

总是使用JSON格式与Ajax,出于以下原因:

  • 一个典型的ajaxpipe道将被configuration为JSON。
  • “eval()”的使用将被批评为安全风险。

作为一个Ajaxpipe道的例子,考虑一个涉及Node服务器和jQuery客户端的程序。 客户端程序使用$.ajax({dataType:'json',...etc.});forms的jQuery调用$.ajax({dataType:'json',...etc.}); 。 JQuery创build一个jqXHR对象供以后使用,然后打包并发送相关的请求。 服务器接受请求,处理它,然后准备响应。 服务器程序将调用res.json(data)方法打包并发送响应。 回到客户端,jQuery接受响应,查阅关联的jqXHR对象,并处理JSON格式的数据。 这一切都不需要手动数据转换。 响应不涉及对Node服务器上的JSON.stringify()的显式调用,也不对客户机上的JSON.parse()进行显式调用; 这一切都为你处理。

使用“eval”与代码注入安全风险相关联。 你可能认为没有办法可以发生,但黑客可以得到很有创意。 另外,“eval”对于JavaScript优化来说是有问题的。

如果您发现自己使用“stringify()”函数,请注意,具有该名称的某些函数将创build与“eval”兼容的string,而不是与JSON兼容的string。 例如,在Node中,下面给出了以“eval”兼容格式创buildstring的函数:

 var stringify = require('node-stringify'); // generates eval() format 

这可能是有用的,但除非你有特定的需求,这可能不是你想要的。

如果返回一个数组并返回一个单独的对象,那么你也可以尝试返回一个包含该单个对象的数组作为单个对象:

 [ { title: "One", key: "1" } ] 

这样你就可以返回一个一致的数据结构,一个对象数组,不pipe数据有效载荷。

我发现你已经尝试用“括号”包装你的单个对象,并且用示例来提示这个,因为当然JavaScript不同于..(..)

如果jQuery的error handling程序被调用,并且XHR对象包含“parsing器错误”,这可能是从服务器返回的parsing器错误。

当您尝试提供一个参数来检索单个logging时,您调用没有参数的服务时是多重结果scheme吗?

你是从什么后端回来的?

例如,在ASMX服务中,当参数作为JSON对象而不是JSONstring提供给jQuery时通常是这种情况。 如果你为jQuery提供了一个实际的JSON对象作为它的“data”参数,它将把它序列化成标准的&分隔的k,v对,而不是把它作为JSON发送。

我发现在我的一些实现中,我不得不添加:

 obj = new Object; obj = (data.obj); 

这似乎解决了这个问题。 是否评估对我来说似乎是完全一样的。

jQuery在某些JSON键上扼stream圈 我在PHP中发送这个JSON片段:

 echo json_encode((object) array('result' => 'success')); 

重命名“结果”键到别的工作。 我猜这是一种保留字的冲突,可能是jQuery(1.4.2)中的一个bug。

在ColdFusion环境中,即使格式良好的JSON也会导致错误,即在ColdFusionpipe理器(在debugging和日志logging>debugging输出设置下)中启用了“启用请求debugging输出”。 debugging信息将与JSON数据一起返回,从而使其无效。

也试试这个

 $.ajax({ url: url, data:datas, success:function(datas, textStatus, jqXHR){ var returnedData = jQuery.parseJSON(datas.substr(datas.indexOf('{'))); })}; 

在我的情况下,服务器响应与未知的字符之前'{'

我得到status = parseerror和xhr.status = 200。

这个问题对我来说是JSON响应中的URL''切换到'/'固定这个。

我正在为此苦苦挣扎,花了几个小时试图弄清楚,直到我用萤火虫显示数据对象。

 var data = eval("(" + data.responseText + ")"); console.log(data.count); 

使用

 $data = yourarray(); json_encode($data) 

在服务器端。 在客户端使用数据typesJSON的ajax,并确保您的文件编码不是UTF-8与BOM,它必须是UTF-8。