PythonでJSONオブジェクトを動的に構築する方法は?


274

私はPythonが初めてで、JSONデータで遊んでいます。既存のJSONオブジェクトにキーと値を追加して、JSONオブジェクトを動的に構築したいと思います。

私は以下を試しましたが、私は得ますTypeError: 'str' object does not support item assignment

import json

json_data = json.dumps({})
json_data["key"] = "value"

print 'JSON: ', json_data

回答:


554

オブジェクトをJSON文字列エンコードする前に作成します。

import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

JSONはシリアル化形式であり、構造を表すテキストデータです。それ自体は、その構造ではありません。


2
あなたの解決策は私にとって魅力のように働いた。最後の行の意味が理解できませんでした。少し詳しく説明してください。ありがとう。
akki

6
@akki:OPは、JSON文字列(オブジェクトをエンコードする一連の文字)をオブジェクト自体として処理しようとしました。彼らはを使用しようとしましjson_data['key'] = 'value'json_dataが、はPython辞書ではないため機能しません。
Martijn Pieters

オブジェクトを指定すると、オブジェクトをJSONまたは辞書に何らかの方法で自動的に変換できますか?
チャーリーパーカー

@CharlieParker:広すぎる。JSONは少数のデータ型のみを含む非常に制限された形式であるため、Pythonオブジェクトは単にJSONに反映されるだけではありません。多くの質問は、SOすでにここにあります。そのカバー特定のなどジャンゴやSQLAlchemyのモデル、などのオブジェクトの種類とJSON、
マルタインピーテルス

1
@AlexJohnson:pip list同じ情報を提供し、JSONを出力できます:pip list --format=json
Martijn Pieters

25

Pythonディクショナリを作成してJSONに1行でシリアル化できます。醜くもありません。

my_json_string = json.dumps({'key1': val1, 'key2': val2})

21

辞書(またはより複雑なデータのネストされた辞書)を構築できるソリューションがすでに提供されていますが、オブジェクトを構築する場合は、 'ObjDict'を試してください。これにより、作成されるjsonをより詳細に制御できます(例えば、順序の保持など)。概念の優先表現となるオブジェクトとして構築することができます。

最初にobjdictをインストールします。

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()

2
これはまさに私が探していたものです!dictは順序付けされていないため、json.dumpsieを呼び出すときにアルファベット順で並べ替えることはできますがjson.dumps(response, sort_keys=True, indent=4)、優先順、グループ化、および表現ではなく、アルファベット順のままです
Jonathan

11

あなたはEasyDictライブラリdoc)を使うことができます:

EasyDictを使用すると、dict値に属性としてアクセスできます(再帰的に機能します)。Python dictのJavascriptのようなプロパティのドット表記。

使用法

>>> from easydict import EasyDict as edict
>>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> d.foo
3
>>> d.bar.x
1

>>> d = edict(foo=3)
>>> d.foo
3

[ インストール ]:

  • pip install easydict

Benyaminさん、JSONダンプとロードの使用法を示すように例を編集していただけませんか?
Thom Ives

7

以前の答えはすべて正解です。これを行う簡単な方法がもう1つあります。たとえば、オブジェクトをシリアル化および逆シリアル化するためのDictデータ構造を作成します。

(PythonではNoneはNullであり、これを意図的に使用してnullを格納し、json nullに変換する方法を示すことに注意してください

import json
print('serialization')
myDictObj = { "name":"John", "age":30, "car":None }
##convert object to json
serialized= json.dumps(myDictObj, sort_keys=True, indent=3)
print(serialized)
## now we are gonna convert json to object
deserialization=json.loads(serialized)
print(deserialization)

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.