web-dev-qa-db-fra.com

AttributeError: l'objet 'unicode' n'a pas d'attribut 'values' lors de l'analyse des valeurs du dictionnaire JSON

J'ai le dictionnaire JSON suivant:

{
 u'period': 16, u'formationName': u'442', u'formationId': 2, 
 u'formationSlots': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0], 
 u'jerseyNumbers': [1, 20, 3, 15, 17, 5, 19, 6, 18, 25, 10, 2, 4, 12, 16, 22, 24, 
                    34], 
 u'playerIds': [23122, 38772, 24148, 39935, 29798, 75177, 3860, 8505, 
               26013, 3807, 34693, 18181, 4145, 23446, 8327, 107395, 29762, 254558], 
 u'captainPlayerId': 29798, 
 u'startMinuteExpanded': 0, 
 u'endMinuteExpanded': 82, 
 u'formationPositions': [{u'horizontal': 5.0, u'vertical': 0.0}, 
     {u'horizontal': 1.0, u'vertical': 2.5}, {u'horizontal': 9.0, u'vertical': 2.5}, 
     {u'horizontal':3.5, u'vertical': 6.0}, {u'horizontal': 3.5, u'vertical': 2.5}, 
     {u'horizontal': 6.5, u'vertical': 2.5}, {u'horizontal': 1.0, u'vertical': 6.0}, 
     {u'horizontal': 6.5, u'vertical': 6.0}, {u'horizontal': 6.5, u'vertical': 9.0}, 
     {u'horizontal': 3.5, u'vertical': 9.0}, {u'horizontal': 9.0, u'vertical': 6.0}]
}

Comme vous pouvez le voir, certaines des valeurs du dictionnaire sont contenues dans des listes. J'essaie d'obtenir toutes les valeurs de cet objet par programmation comme ceci:

for myvalue in myjsonobject:
    print mydict
    for mysubvalue in myvalue:
        print mysubvalue

Cela imprime les clés du dictionnaire:

period
formationName
formationId
formationSlots
jerseyNumbers
playerIds
captainPlayerId
startMinuteExpanded
endMinuteExpanded
formationPositions

Quand ce que je veux vraiment, ce sont les valeurs. J'ai essayé de remplacer la ligne print mysubvalue par print mysubvalue.values(), mais cela provoque l'erreur suivante:

Traceback (most recent call last):
  File "C:\Python27\counter.py", line 78, in <module>
    print mysubdict.values()
AttributeError: 'unicode' object has no attribute 'values'

Je suppose ici que je n'ai pas besoin d'utiliser json.loads(mysubdict) pour me permettre d'accéder à la fonction .values(). Si c'est le cas, je ne sais pas pourquoi j'obtiens cette erreur.

Quelqu'un peut-il aider?

Merci

11
gdogg371

Si vous parcourez le dictionnaire lui-même (pour myvalue dans myjsonobject), vous itérerez sur les clés du dictionnaire. Lors d'une boucle avec une boucle for, le comportement sera le même que vous boucliez sur le dict (myjsonobject) lui-même, myjsonobject.keys() ou myjsonobject.iterkeys(). dict.iterkeys() est généralement préférable car elle est explicite et efficace:

for myvalue in myjsonobject.iterkeys():

8
Ranvijay Sachan

Vous parcourez les clés du dictionnaire JSON, puis vous appelez .values ​​() sur chaque clé.

for myvalue in myjsonobject:

itère sur les touches. Donc, lorsque vous arrivez à une clé qui est une chaîne, disons, u'period ': 16, il affichera' period'.values ​​(), qui crache cette erreur car la classe de chaîne n'a pas .values ​​().

Si vous souhaitez aplatir l'intégralité du dictionnaire JSON à une profondeur arbitraire, je suggère une approche récursive.

1
Andrew