Почему мой JSONP возвращает неверный JSON - PullRequest
1 голос
/ 15 сентября 2011

В настоящее время я извлекаю данные из внешнего XML-файла и преобразую его в JSON через Python / Django. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я извлекаю JSON в JQUERY, я получаю сообщение об ошибке «Invalid JSON», однако, когда я помещаю свой JSON через валидатор, такой как JSONFormatter , мне говорят мой 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)
    }
});

Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Вы должны сообщить 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=? в ваш URL, поэтому его здесь не нужно.

Вы также можете использовать getJSON (для этого необходимо добавить ?callback=?).

$.getJSON('http://www.urltomydomain.com?callback=?', function(json){
    console.log('success');
    console.log(json);
});

Вы должны использовать ?callback=?, поскольку jQuery автоматически заменит второе ? на динамическое имя для обратного вызова.функция.

0 голосов
/ 15 сентября 2011

Весь смысл JSONP в том, что вы не возвращаете JSON, вы возвращаете JavaScript, который браузер может выполнить .

Вместо использования функции JJuery AJAX (и вместонеправильно указав, что он ожидает dataType из json), вы можете просто добавить новый <script> на страницу:

$.getScript('http://www.urltomydomain.com?callback=mycallback');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...