从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
属性,只有responseText
和responseXML
。 只要有点真正的响应你的请求一些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.response
replacethis.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