Распаковка и отображение JSON-объектов, возвращаемых через jQuery из бэкэнда Django - PullRequest
0 голосов
/ 11 февраля 2011

Часть моего приложения принимает некоторые ингредиенты, а затем выплевывает соответствующие рецепты.Я пытаюсь преобразовать его, чтобы использовать только AJAX.У меня возникают проблемы с анализом данных, возвращающихся в JSON, и доступом к ним для использования на внешнем интерфейсе.

Мой код в Django views.py выглядит следующим образом:

recipes = Recipe.objects.all() #shortened to all objects for example purposes
import simplejson
data = ''    
for r in recipes:
        the_date = r.date_created.strftime("%b %d")
        recipe_dict = { 'id' : r.id,
                    'name' : r.name,
                    'user' : r.user.username,
                    'date_created' : the_date,
                    'votes' : r.votes,
                    'slug' : r.slug }
        data += simplejson.dumps(recipe_dict)+'\n'

        return HttpResponse(data)

Мой javascript выглядит следующим образом:

//request an updated list of recipes with AJAX
$.get('/recipes/discover', { 'ingredients': ingredients },

    //display these new relevant recipes
    function(recipes){
        $.each(recipes, function() {
                $("#results").append("<li id='recipe-"+ this.id +"'>"+ this.name +"</li>");
        })
    })
    .complete(function(){ $('#loading_spinner').fadeOut(1000); })
});

Вывод, который я получаю этим способом, заканчивается тем, что дает мне новый li для того, что кажется каждым символом ответа JSON ... так что .each()проходит через каждый символ.

Я также пытался использовать jQuery.parseJSON(data); перед запуском каждого, но, похоже, это работает, только когда возвращен только один рецепт JSON.Я думаю, что у меня что-то неправильно отформатировано в JSON, или я его неправильно анализирую?

Заранее спасибо!

1 Ответ

2 голосов
/ 11 февраля 2011

Вам необходимо разделить объекты в JSON запятой и заключить массивы в [].

Похоже, ваш возвращенный JSON будет выглядеть примерно так:

{'name': ... }{'name':...}

И это должно выглядеть так:

[{'name': ... },{'name':...}]

Именно поэтому один рецепт будет обрабатываться правильно, поскольку это допустимый объект JSON, но кратные не работают.

Если это допустимый JSON, jQuery.parseJSON (...) будет работать правильно.

Вот справочник JSON.

...