我正在从外部XML文件中提取数据并通过Python / Django将其转换为JSON。我遇到的问题是,当我在JQUERY中提取JSON时,我收到“无效JSON”的错误,但是当我通过JSONFormatter之类的验证器放置我的JSON时,我被告知我的JSON是有效的。
Python代码:
def test(request):
tree = lxml.etree.parse("http://somedomain.com")
deals = tree.xpath("/page/deals/deal")
deals_info = []
for deal in deals:
this_value = {
"id":deal.find("id").text,
"totaldealcount":deal.find("totaldealcount").text,
"offer":deal.find("offer").text,
"link":deal.find("link").text,
"merchantname":deal.find("merchantname").text,
"saleprice":deal.find("saleprice").text,
"productvalue":deal.find("productvalue").text,
}
deals_info.append(this_value)
json_deals = '{"deals":' + simplejson.dumps(deals_info) + '}'
if("callback" in request.GET.keys()):
callback = request.GET["callback"]
else:
callback = None
if(callback):
response = HttpResponse("%s(%s)" % (
callback,
simplejson.dumps(deals_info)
), mimetype="application/json"
)
else:
response = HttpResponse(json_deals, mimetype="application/json")
return response
返回的JSON
mycallback([{"productvalue": "40.00", "totaldealcount": "4", "merchantname": "Joes Door Knobs", "offer": "$40 Deal for $20", "link": "http://somelink.com", "saleprice": "20.00", "id": "3112264"}, {"productvalue": "20.00", "totaldealcount": "4", "merchantname": "Bob's Pizza", "offer": "$20 Deal for $10", "link": "http://somelink.com", "saleprice": "10.00", "id": "3112266"}])
我的jQuery代码
$.ajax({
url: "http://www.urltomydomain.com?callback=mycallback",
data: {},
dataType: "json",
success: function(json) {
console.log('success');
console.log(json);
},
error: function(x,y,z) {
// x.responseText should have what's wrong
console.log(x)
console.log(y)
console.log(z)
}
});
任何帮助都将不胜感激。
由于
答案 0 :(得分:4)
你需要告诉jQuery这是JSONP(它实际上只是一个脚本。它是用JSON数据调用函数),而不是JSON数据本身。它说“无效JSON”因为jQuery试图解析函数调用。
$.ajax({
url: "http://www.urltomydomain.com",
dataType: "jsonp",
success: function(json) {
console.log('success');
console.log(json);
},
error: function(x,y,z) {
// x.responseText should have what's wrong
console.log(x)
console.log(y)
console.log(z)
}
});
dataType: "jsonp"
自动将?callback=?
添加到您的网址,因此此处不需要。
您还可以使用getJSON
(要求您添加?callback=?
)。
$.getJSON('http://www.urltomydomain.com?callback=?', function(json){
console.log('success');
console.log(json);
});
您应该使用?callback=?
,因为jQuery会自动将第二个?
替换为回调函数的动态名称。
答案 1 :(得分:0)
JSONP的重点在于您没有返回JSON,而是返回浏览器可以执行的JavaScript 。
您可以向页面添加新的dataType
,而不是使用jQuery的AJAX函数(而不是错误地告诉它期望json
<script>
),而只是向页面添加新的$.getScript('http://www.urltomydomain.com?callback=mycallback');
:
{{1}}