TypeError: строковые индексы должны быть целыми при разборе JSON с использованием Python?

Теперь я запутался, почему я не могу разобрать эту строку JSON. Подобный код отлично работает на другой строке JSON, но не на этом - я пытаюсь разобрать JSON String и извлечь script из JSON.

Ниже мой код.

for step in steps:
    step_path = '/example/v1' +'/'+step

    data, stat = zk.get(step_path)
    jsonStr = data.decode("utf-8")
    print(jsonStr)
    j = json.loads(json.dumps(jsonStr))
    print(j)
    shell_script = j['script']
    print(shell_script)

Итак, первая print(jsonStr) выведет что-то вроде этого -

{"script":"#!/bin/bash\necho Hello world1\n"}

И второй print(j) выведет что-то вроде этого -

{"script":"#!/bin/bash\necho Hello world1\n"}

И затем третий отпечаток не распечатывается, и он дает эту ошибку -

Traceback (most recent call last):
  File "test5.py", line 33, in <module>
    shell_script = j['script']
TypeError: string indices must be integers

Так что мне интересно, что я здесь делаю неправильно?

Я использовал тот же код выше, чтобы разобрать JSON, и он отлично работает.

Ответ 1

Попробуйте заменить j = json.loads(json.dumps(jsonStr)) на j = json.loads(jsonStr).

Ответ 2

Проблема заключается в том, что jsonStr - это строка, которая кодирует некоторый объект в JSON, а не фактический объект.

Вы, очевидно, знали, что это строка, потому что вы ее назвали jsonStr. И это подтверждается тем фактом, что эта линия работает:

jsonStr = data.decode("utf-8")

Итак, jsonStr - это строка. Вызов json.dumps на строке вполне законный. Не имеет значения, была ли эта строка кодировкой JSON для какого-либо объекта или вашей фамилии; вы можете закодировать эту строку в JSON. И тогда вы можете декодировать эту строку, возвращая исходную строку.

Итак, это:

j = json.loads(json.dumps(jsonStr))

... вернет вам ту же строку, что и jsonStr в j. Который вы все еще не декодировали к исходному объекту.

Для этого просто не используйте дополнительный код:

j = json.loads(jsonStr)

Если это неясно, попробуйте сыграть с ним интерактивный терминал:

>>> obj = ['abc', {'a', 'b': 2}]
>>> type(obj)
list
>>> obj[1]['b']
2
>>> j = json.dumps(obj)
>>> type(j)
str
>>> j[1]['b']
TypeError: string indices must be integers, not str
>>> jj = json.dumps(obj)
>>> type(jj)
str
>>> j
'["abc", {"a": 1, "b": 2}]'
>>> jj
'"[\\"abc\\", {\\"a\\": 1, \\"b\\": 2}]"'
>>> json.loads(j)
['abc', {'a': 1, 'b': 2}]
>>> json.loads(j) == obj
True
>>> json.loads(jj)
'["abc", {"a": 1, "b": 2}]'
>>> json.loads(jj) == j
True
>>> json.loads(jj) == obj
False