从XmlHttpRequest.responseJSONparsingJSON

我试图parsingjavscript中的一个.json响应。

我通过XmlHttpRequest获取JSON。

var req = new XMLHttpRequest; req.overrideMimeType("application/json"); req.open('GET', BITLY_CREATE_API + encodeURIComponent(url) + BITLY_API_LOGIN, true); var target = this; req.onload = function() {target.parseJSON(req, url)}; req.send(null); parseJSON: function(req, url) { if (req.status == 200) { var jsonResponse = req.responseJSON; var bitlyUrl = jsonResponse.results[url].shortUrl; } 

我在一个Firefox插件。 当我运行时,我得到的错误“jsonResponse是未定义的”行var bitlyUrl = jsonResponse.results[url].shortUrl; 。 我在这里parsingJSON时做错了什么? 或者这个代码有什么问题?

标准的XMLHttpRequest没有responseJSON属性,只有responseTextresponseXML 。 只要有点真正的响应你的请求一些JSON, responseText应该包含作为文本的JSON代码,所以你所要做的就是parsing它:

 var jsonResponse = JSON.parse(req.responseText); 

如果您更喜欢使用responseJSON ,但想要比JQuery更轻量级的解决scheme,则可能需要查看我的JSONHttpRequest。 它的工作方式与普通的XMLHttpRequest完全相同,但也提供了responseJSON属性。 所有你必须改变你的代码将是第一行:

 var req = new JSONHttpRequest(); 

JSONHttpRequest还提供了以JSON方式轻松发送JavaScript对象的function。 更多细节和代码可以在我的博客中find: http : //pixelsvsbytes.com/2011/12/teach-your-xmlhttprequest-some-json/ 。

PS:我知道链接到我自己的博客将不会在这里赞赏,但我认为我的脚本是一个很好的解决scheme,所以我反正张贴它。 请留下评论,如果你想我删除这个职位,我会这样做。

我认为你必须包括jQuery使用responseJSON

没有jQuery,你可以尝试responseText,并尝试像eval("("+req.responseText+")");

更新 :请阅读有关eval的评论,您可以使用eval进行testing,但不要在工作扩展中使用它。

要么

使用json_parse :它不使用eval

注意:我只在Chrome中testing过。

它向XMLHttpRequest添加了一个原型函数。XHR2

XHR 1中,你可能只需要用this.responsereplacethis.responseText

 Object.defineProperty(XMLHttpRequest.prototype,'responseJSON',{value:function(){ return JSON.parse(this.response); },writable:false,enumerable:false}); 

返回xhr2中的json

 xhr.onload=function(){ console.log(this.responseJSON()); } 

编辑

如果你打算使用XHR与arraybuffer或其他响应types,那么你必须检查响应是否是一个string

在任何情况下,你必须添加更多的检查,例如,如果它不能parsingJSON。

 Object.defineProperty(XMLHttpRequest.prototype,'responseJSON',{value:function(){ return (typeof this.response==='string'?JSON.parse(this.response):this.response); },writable:false,enumerable:false}); 

你可以简单地设置xhr.responseType = 'json';

 const xhr = new XMLHttpRequest(); xhr.open('GET', 'http://echo.jsontest.com/insert-key-here/insert-value-here/key/value'); xhr.responseType = 'json'; xhr.onload = function(e) { if (this.status == 200) { console.log('response', this.response); // JSON response } }; xhr.send(); 

如果是FF扩展,则使用nsIJSON :

 var req = new XMLHttpRequest; req.overrideMimeType("application/json"); req.open('GET', BITLY_CREATE_API + encodeURIComponent(url) + BITLY_API_LOGIN, true); var target = this; req.onload = function() {target.parseJSON(req, url)}; req.send(null); parseJSON: function(req, url) { if (req.status == 200) { var jsonResponse = Components.classes["@mozilla.org/dom/json;1"] .createInstance(Components.interfaces.nsIJSON.decode(req.responseText); var bitlyUrl = jsonResponse.results[url].shortUrl; } 

对于网页,只需使用JSON.parse而不是Components.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON.decode