Десериализовать список вложенных словарей в более простую форму - PullRequest
0 голосов
/ 02 декабря 2010

Как я могу десериализовать это:

[{'fields': {'active': 1,
             'image': 'http://img.rasset.ie/0003db75-150.jpg',
             'name': 'Bad Fellas',
             'position': 0,
             'url': 'http://www.rte.ie/tv/programmes/bad_fellas.html'},
  'model': 'rte_site.show',
  'pk': 1},
 {'fields': {'active': 1,
             'image': 'http://img.rasset.ie/0002c8d0-250.jpg',
             'name': 'Crimecall',
             'position': 0,
             'url': 'http://www.rte.ie/tv/crimecall/'},
  'model': 'rte_site.show',
  'pk': 2}]

, чтобы сформировать:

{'1': {'pk': 1, "url": "http....", "image": 'http://....', 'name': 'Bad Fellas'}, '2': {...}}

? Можно ли вообще так раздеться?


EDIT Я пробовал два решения, и я получаю:

string indices must be integers, not str

вот ссылка: http://ntt.vipserv.org/data/shows

и весь мой код функции django:

def shows_json(request):
    objects = Show.objects.all()
    tmp = toJSON(objects)
    l = [{"pk": d["pk"], "url": d["fields"]["url"], "image": d["fields"]["image"], "name": d["fields"]["name"]} for d in tmp]
    json = dict(str((d["pk"]), d) for d in l)

    result = render_to_string('jsonlist.html', RequestContext(request, {
                'json': json,
            }))
    return HttpResponse(result)

def toJSON(obj):
   if isinstance(obj, QuerySet):
       return simplejson.dumps(obj, cls=DjangoJSONEncoder)
   if isinstance(obj, models.Model):
       set_obj = [obj]
       set_str = simplejson.dumps(simplejson.loads(serialize('json', set_obj)))
       str_obj = set_str[1:len(set_str)-2]
   return str_obj

from django.core.serializers import serialize
from django.utils.simplejson import dumps, loads, JSONEncoder
from django.db.models.query import QuerySet
from django.utils.functional import curry

class DjangoJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, QuerySet):
            return loads(serialize('json', obj))
        return JSONEncoder.default(self,obj)
dumps = curry(dumps, cls=DjangoJSONEncoder)

Ответы [ 2 ]

1 голос
/ 02 декабря 2010
>>> l = [{"pk": d["pk"], "url": d["fields"]["url"], "image": d["fields"]["image"], "name": d["fields"]["name"]} for d in l]
>>> new_data = dict((d["pk"], d) for d in l)
>>> new_data 
{1: {'url': 'http://www.rte.ie/tv/programmes/bad_fellas.html', 'pk': 1, 'image': 'http://img.rasset.ie/0003db75-150.jpg', 'name': 'Bad Fellas'}, 2: {'url': 'http://www.rte.ie/tv/crimecall/', 'pk': 2, 'image': 'http://img.rasset.ie/0002c8d0-250.jpg', 'name': 'Crimecall'}}

Редактировать: попробуйте это

def shows_json(request):
    objects = Show.objects.all()
    l = [{"pk": d["pk"], "url": d["fields"]["url"], "image": d["fields"]["image"], "name": d["fields"]["name"]} for d in objects]
    tmp = dict(str((d["pk"]), d) for d in l)
    json = toJSON(tmp)
    result = render_to_string('jsonlist.html', RequestContext(request, {
                'json': json,
            }))
    return HttpResponse(result)
0 голосов
/ 02 декабря 2010

Я думаю, вы ищете что-то вроде этого:

dict((x['pk'], x['fields']) for x in your_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...