web-dev-qa-db-ja.com

TypeError:Pythonを使用してJSONを解析する際、文字列インデックスは整数でなければなりませんか?

この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を解析しましたが、正常に動作します。

19
AKIWEB

j = json.loads(json.dumps(jsonStr))j = json.loads(jsonStr)に置き換えてみてください。

19
1st1

問題は、jsonStrが実際のオブジェクトではなく、JSONでオブジェクトをエンコードする文字列であることです。

明らかにknewそれはjsonStrと呼ばれるため、文字列でした。そして、この行が機能するという事実によって証明されています:

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

したがって、jsonStrは文字列です。文字列でjson.dumpsを呼び出すことは完全に合法です。その文字列がオブジェクトのJSONエンコーディングであるか、あなたの姓であるかは関係ありません。その文字列をJSONでエンコードできます。そして、その文字列をデコードして、元の文字列を取得できます。

したがって、この:

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

jsonStrjとまったく同じ文字列を返します。あなたはまだ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
31
abarnert