2010-12-02 22 views
0

Comment puis-je désérialiser ceci:liste Deserialize des dictionnaires imbriqués à une forme plus simple

[{'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}] 

à la forme:

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

? Est-il même possible de le dépouiller de cette façon?


EDIT J'ai essayé deux solutions et j'obtenir:

string indices must be integers, not str

est ici le lien: http://ntt.vipserv.org/data/shows

et mon code ensemble de la fonction 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) 
+0

On dirait que vous êtes en train de convertir vos données à une chaîne avec la ligne toJSON, qui est à l'origine de la liste compréhension à l'échec. –

+0

bien fondamentalement j'essaye de transformer un queryset en objet de json – decarbo

+0

D'accord, mais vous devez effectuer ce traitement sur les données quand c'est une liste de dictionnaires, pas une chaîne. –

Répondre

1
>>> 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'}} 

Edit: essayez cette

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

toujours le même:/il se bloque dans la première ligne – decarbo

+0

J'avais mal lu votre édition et pensé que l'erreur était autre chose. Votre problème est que 'tmp' est une chaîne quand vous essayez la compréhension de la liste. –

+0

jsonized mon objet différemment encore votre solution était correcte :) – decarbo

0

I e encre que vous cherchez quelque chose comme ceci:

dict((x['pk'], x['fields']) for x in your_list) 
+0

@nosklo: ouais, j'étais trop occupé à reformater la question;) – Wolph