我目前正在对Jquery,Ajax和JSON进行练习。我找到了几种获取数据的方法,但现在我想将这些数据从JSON存储到变量中。据我所知,JSON只是一大堆物体。
我的JSON文件如下所示:
{
"Products" : [{
"Id": 11,
"Name": "Keyboard",
"Description": "Microsoft Keyboard",
"PriceExVat": 199.95,
"QtyInStock": 11
},
{
"Id": 211,
"Name": "Mouse",
"Description": "Microsoft 3 button Mouse with scroller",
"PriceExVat": 199.95,
"QtyInStock": 30
},
{
"Id": 35,
"Name": "TowerCase",
"Description": "Mini Tower Case with 450W power unit",
"PriceExVat": 600.95,
"QtyInStock": 23
},
{
"Id": 58,
"Name": "Monitor",
"Description": "17inch LCD monitor",
"PriceExVat": 1499.95,
"QtyInStock": 12
}]
}
我的Jquery代码如下所示:
var products;
$(document).ready(function(){
$.ajax({
type: 'GET',
url: 'data/Products.json',
data: { get_param: 'value'},
dataType: 'json',
complete: function(data){
products = data; //Store JSON data
}
});
});
$(document).ajaxComplete(function(){
alert(products); //returns object [Object]. When attempting to get data here like products[0].Name, an error occurs saying that Name does not exist
});
我之所以完成这样的代码是因为我知道ajax是异步 javascript和xml。因此,如果我使用success : function(){...}
,则不会保证我的数据会保存到变量products
(即时间问题)。
所以我设置了ajax的代码来在操作完成时存储数据。这将触发ajaxComplete()
事件,理论上允许我访问保存到变量的数据。
虽然这里有一个打嗝,我的问题的原因。如果我alert(products)
,我会收到回复
稍微改变我的代码(因为现在我认为应该存储在该变量中的内容),alert(products.Products[0].Name);
会抛出错误(暗示这个变量是未定义的)
是否有任何建议可以传递给我跟随我获取数据?这个变量的目标是我想用它来分页到我的表中,并且还减少了对json文件(稍后可能成为远程托管文件)的调用量,而不是使用存储在变量中的数据。
修改 将警报更改为console.Log
Object {readyState:4,setRequestHeader:function,getAllResponseHeaders:function,getResponseHeader:function,overrideMimeType:function ...}
不是我希望看到的。
修改 显然我甚至没能正确显示日志。
Object {readyState: 4, setRequestHeader: function, getAllResponseHeaders: function, getResponseHeader: function, overrideMimeType: function…}
abort: function (a){a=a||"abort",p&&p.abort(a),w(0,a);return this}
always: function (){i.done.apply(i,arguments).fail.apply(i,arguments);return this}
complete: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
done: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
error: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
fail: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
getAllResponseHeaders: function (){return s===2?n:null}
getResponseHeader: function (a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c}
isRejected: function (){return!!i}
isResolved: function (){return!!i}
overrideMimeType: function (a){s||(d.mimeType=a);return this}
pipe: function (a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()}
progress: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
promise: function (a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}
readyState: 4
responseText: "{
↵ "Products" : [{
↵ "Id": 11,
↵ "Name": "Keyboard",
↵ "Description": "Microsoft Keyboard",
↵ "PriceExVat": 199.95,
↵ "QtyInStock": 11
↵ },
↵ {
↵ "Id": 211,
↵ "Name": "Mouse",
↵ "Description": "Microsoft 3 button Mouse with scroller",
↵ "PriceExVat": 199.95,
↵ "QtyInStock": 30
↵ },
↵ {
↵ "Id": 35,
↵ "Name": "TowerCase",
↵ "Description": "Mini Tower Case with 450W power unit",
↵ "PriceExVat": 600.95,
↵ "QtyInStock": 23
↵ },
↵ {
↵ "Id": 58,
↵ "Name": "Monitor",
↵ "Description": "17inch LCD monitor",
↵ "PriceExVat": 1499.95,
↵ "QtyInStock": 12
↵ },
↵ {
↵ "Id": 234,
↵ "Name": "Laptop",
↵ "Description": "Acer Core I5 Laptop",
↵ "PriceExVat": 6999.95,
↵ "QtyInStock": 7
↵ },
↵ {
↵ "Id": 789,
↵ "Name": "CarryCase",
↵ "Description": "Targus Carry Case",
↵ "PriceExVat": 399.95,
↵ "QtyInStock": 20
↵ },
↵ {
↵ "Id": 7,
↵ "Name": "Harddrive",
↵ "Description": "1TB External Hard Drive",
↵ "PriceExVat": 999.95,
↵ "QtyInStock": 100
↵ },
↵ {
↵ "Id": 51,
↵ "Name": "Projector",
↵ "Description": "HD Projector",
↵ "PriceExVat": 4995.95,
↵ "QtyInStock": 1
↵ },
↵ {
↵ "Id": 901,
↵ "Name": "Joystick",
↵ "Description": "Microsoft Joystick",
↵ "PriceExVat": 400.95,
↵ "QtyInStock": 2
↵ },
↵ {
↵ "Id": 500,
↵ "Name": "USBCable",
↵ "Description": "3m USB-toUSB cable",
↵ "PriceExVat": 80.95,
↵ "QtyInStock": 5
↵ }]
↵}"
setRequestHeader: function (a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this}
state: function (){return e}
status: 200
statusCode: function (a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this}
statusText: "OK"
success: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
then: function (a,b,c){i.done(a).fail(b).progress(c);return this}
__proto__: Object
答案 0 :(得分:0)
所以我修改了一下并找到了parseJSON方法。根据我在Ajax Response中看到的数据,我想我可以使用Ajax ResponseText(这是我需要的数据),将其存储在变量中,并将其解析为JSON。
观看工作产品:
var products;
$(document).ready(function(){
$.ajax({
type: 'GET',
url: 'data/Products.json',
data: { get_param: 'value'},
dataType: 'json',
complete: function(data){
products = data;
}
});
});
$(document).ajaxComplete(function(){
products = $.parseJSON(products.responseText); //Takes AJAX Reponse Text and parses it to JSON
console.log(products.Products[0].Name);
});
答案 1 :(得分:0)
您的complete
函数的参数为data
,但实际上它是jQuery XHR对象。如果您的服务器将内容类型设置为application/json
,则应该仅能使用products = data.responseJSON
。另外,我将变量名从data
更改为xhr
。
https://api.jquery.com/jQuery.ajax/
请参阅有关complete
方法的部分以及Data Types
部分的JSON部分。
如果我是你,我会这样写:
$(document).ready(function(){
$.getJSON('data/Products.json?get_param=value').
done(function(data){
console.log(data.Products[0].name);
});
});
一些注意事项:
ajaxComplete
用于全局代码。它不适合一次性Ajax调用,因为它每次都会为每个Ajax调用运行。这是为了进行全局处理,例如在发生错误时显示消息,或者在服务器响应时表示需要登录的方式显示登录表单。complete
回调返回一个Jquery XHR对象,因此,如果要解析json,则需要在其上使用responseJSON
属性。data
,因此您不需要调用responseJSON
属性。getJSON
仍在呼叫ajax
。