2010-11-27 22 views
1

Dans mon application, je me connecte à un serveur qui renvoie une chaîne unicode style json ressemblant à un dictionnaire de dictionnaires. En conséquence, je voudrais obtenir un dictionnaire nivelé avec id comme une valeur clé et unicode comme ceci:Décomposition et décodage du dictionnaire imbriqué/json

{'1': u'autos','3': u'cities'}

Je charger la réponse avec construit dans le module JSON:

>>> jsonData = json.loads(data) 
>>> jsonData 
{u'1': {u'id': u'1', u'name': u'autos'}, u'3': {u'id': u'3', u'name': u'cities'}, u'2': {u'id': u'2', u'name': u'business'},} 
>>> type(jsonData) 
<type 'dict'> 

Vous pouvez voir l'objet retourné ici. Ensuite, je devrais le décomposer pour se débarrasser du dictionnaire des parents. Et enfin encoder les ID. J'ai trouvé deux méthodes pour faire l'encodage. Un:

>>> import unicodedata 
>>> unicodedata.normalize('NFKD', data).encode('ascii','ignore') 

et seconde:

>>> data.encode('ascii','ignore') 

Comment je dois faire cette tâche, en particulier la décomposition?

+0

Comment voulez-vous dire "se débarrasser du dictionnaire des parents"? Pouvez-vous préciser à quoi vous voulez ressembler lorsque vous avez terminé? –

+0

a modifié la question – decarbo

Répondre

2

Cela devrait fonctionner:

outputdata = {} 
for id, stuff in jsonData.iteritems(): 
    outputdata[id.encode("ascii")] = stuff[u"name"] 

Vous pouvez également utiliser une expression de générateur, comme dans la réponse de Dugres.

+0

'dict ((i.encode (" ascii "), s [u" nom "]) pour i, s dans jsonData.items())' serait encore plus court (mais essentiellement le même). –

+0

@Sven: Et si vous utilisez 2.7/3.1, c'est encore plus court: '{i.encode (" ascii "): s [u" nom "] pour i, s dans jsonData.items()}'. Mais je pensais m'en tenir aux bases ;-) –

+0

Oh, et je remarque juste que nous n'avons pas utilisé 'iteritems()' dans le cas 2.x, mais que nous devrions avoir ... –

0
decomp=dict((v['id'], v['name']) for v in jsondata.values()) 
+0

ne peut pas utiliser générateur puisque id n'est pas pertinent à la position réelle. Encore merci pour la réponse. – decarbo