web-dev-qa-db-ja.com

AttributeError:JSONディクショナリ値を解析するときに「unicode」オブジェクトに属性「values」がありません

次のJSON辞書があります。

_{
 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}]
}
_

ご覧のとおり、辞書の値の一部はリストに含まれています。私はこのオブジェクトからすべての値をプログラム的に取得しようとしています:

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

これは辞書キーを出力します:

_period
formationName
formationId
formationSlots
jerseyNumbers
playerIds
captainPlayerId
startMinuteExpanded
endMinuteExpanded
formationPositions
_

実際に欲しいのは値です。行print mysubvalueをprint mysubvalue.values()に置き換えようとしましたが、これにより次のエラーが発生します。

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

ここでは、json.loads(mysubdict)関数へのアクセスを許可するために.values()を使用する必要がないという経験に基づいた推測をしています。その場合、なぜこのエラーが発生するのかわかりません。

誰でも支援できますか?

ありがとう

11
gdogg371

辞書自体を反復処理する場合(myjsonobjectのmyvalueの場合)、辞書のキーを反復処理します。 forループでループする場合、dict(myjsonobject)自体、myjsonobject.keys()、またはmyjsonobject.iterkeys()をループしても、動作は同じです。 dict.iterkeys()は、明示的かつ効率的であるため、一般的に推奨されます。

for myvalue in myjsonobject.iterkeys():

8
Ranvijay Sachan

JSONディクショナリのキーを反復処理し、各キーで.values()を呼び出しています。

for myvalue in myjsonobject:

キーを反復処理します。したがって、文字列であるキー、たとえばu'period ':16に到達すると、' period'.values()が出力されます。これは、文字列クラスに.values()がないため、そのエラーを吐き出します。

JSON辞書全体を任意の深さまでフラット化する場合は、再帰的なアプローチをお勧めします。

1
Andrew