このJSON文字列を解析できない理由を今混乱させています。同様のコードは他のJSON文字列では正常に機能しますが、これでは機能しません。JSON文字列を解析し、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"}
_
そして、2番目のprint(j)
は次のようなものを出力します-
_{"script":"#!/bin/bash\necho Hello world1\n"}
_
そして、3番目の印刷物は印刷されず、このエラーが発生します-
_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でオブジェクトをエンコードする文字列であることです。
明らかにknewそれはjsonStr
と呼ばれるため、文字列でした。そして、この行が機能するという事実によって証明されています:
jsonStr = data.decode("utf-8")
したがって、jsonStr
は文字列です。文字列でjson.dumps
を呼び出すことは完全に合法です。その文字列がオブジェクトのJSONエンコーディングであるか、あなたの姓であるかは関係ありません。その文字列をJSONでエンコードできます。そして、その文字列をデコードして、元の文字列を取得できます。
したがって、この:
j = json.loads(json.dumps(jsonStr))
…jsonStr
のj
とまったく同じ文字列を返します。あなたはまだdecodedを元のオブジェクトに持っていません。
それを行うには、余分なエンコードを行わないでください:
j = json.loads(jsonStr)
それが明確でない場合は、インタラクティブ端末で遊んでみてください:
>>> obj = ['abc', {'a': 1, '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
>>> jj = json.dumps(j)
>>> 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