Ответ 1
Попробуйте заменить j = json.loads(json.dumps(jsonStr))
на j = json.loads(jsonStr)
.
Теперь я запутался, почему я не могу разобрать эту строку 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, и он отлично работает.
Попробуйте заменить j = json.loads(json.dumps(jsonStr))
на j = json.loads(jsonStr)
.
Проблема заключается в том, что 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