Что значит «индексы str должны быть целыми числами»? - PullRequest
1 голос
/ 27 апреля 2010

Я работаю с диктовками в jython, которые созданы из импорта / анализа JSON. Работая с определенными разделами, я вижу следующее сообщение:

TypeError: str indices must be integers

Это происходит, когда я делаю что-то вроде:

if jsondata['foo']['bar'].lower() == 'baz':
    ...

Где jsondata выглядит так:

{'foo': {'bar':'baz'} }

Что это значит и как мне это исправить?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

Как говорят Марсело и Иво, похоже, что вы пытаетесь получить доступ к необработанной строке JSON, не разбирая ее сначала в Python через json.loads(my_json_string).

2 голосов
/ 28 апреля 2010

Перед получением данных из dict необходимо проверить тип для dict и наличие 'z' в dict.

>>> jsondata = {'a': '', 'b': {'z': True} }
>>> for key in jsondata:
...     if type(jsondata[key]) is dict and 'z' in jsondata[key].keys() and jsondata[key]['z'] is True:
...         print 'yes'
...
yes
>>>

или более короткий с dict.get

>>> jsondata = {'a': '', 'b': {'z': True}, 'c' :{'zz':True}}
>>> for key in jsondata:
...     if type(jsondata[key]) is dict and jsondata[key].get('z',False):
...         print 'yes'
...
yes
>>>
1 голос
/ 27 апреля 2010

На самом деле ваше утверждение должно повысить SyntaxError: can't assign to function call из-за того, что вы пропустили = и, таким образом, делаете присваивание вместо проверки на равенство.

Поскольку я не получаю TypeError при запуске показанного вами кода, я полагаю, что вы сначала исправили недостающее =, а после этого вернулись к тому, что говорит Stacktrace.

Но также возможно, что ваши jsondata не были декодированы и, следовательно, все еще представляют собой простой текст, что, конечно, приведет к ошибке индексации.

...