web-dev-qa-db-ja.com

python JSONオブジェクトは、 'dictではなくstr、bytesまたはbytearrayである必要があります

Python 3では、以前に保存したjsonを次のようにロードします。

json.dumps(dictionary)

出力は次のようなものです

{"('Hello',)": 6, "('Hi',)": 5}

私が使うとき

json.loads({"('Hello',)": 6, "('Hi',)": 5})

それは機能しません、これは起こります:

TypeError:JSONオブジェクトは 'dict'ではなくstr、bytesまたはbytearrayでなければなりません

24
dila93

json.loadsは入力として文字列を取り、出力として辞書を返します。

json.dumpsは入力として辞書を受け取り、出力として文字列を返します。


json.loads({"('Hello',)": 6, "('Hi',)": 5})を使用すると、

辞書を入力としてjson.loadsを呼び出しています。

次のように修正できます(それが何の意味なのかよくわかりませんが)。

d1 = {"('Hello',)": 6, "('Hi',)": 5}
s1 = json.dumps(d1)
d2 = json.loads(s1)
42
barak manos

文字列が必要な関数に辞書を渡します。

この構文:

{"('Hello',)": 6, "('Hi',)": 5}

有効なPython辞書リテラルと有効なJSONオブジェクトリテラルの両方です。ただし、loadsは辞書を取りません。文字列を取得し、JSONとして解釈して結果を返しますas辞書(またはJSONに応じて文字列または配列または数値ですが、通常は辞書)。

この文字列をloadsに渡すと:

'''{"('Hello',)": 6, "('Hi',)": 5}'''

次に、渡そうとしている辞書によく似た辞書を返します。

JSONオブジェクトリテラルとPython辞書リテラルの類似性を活用するには、次のようにします。

json.loads(str({"('Hello',)": 6, "('Hi',)": 5}))

しかし、どちらの場合でも、渡された辞書を取得するだけなので、それが何を達成するかはわかりません。あなたの目標は何ですか?

6
Mark Reed