strdata
リストとして初期化する:
strdata = []
ループ内で、JSON ダンプをリストに追加します。
strdata.append(json.dumps(data, default=lambda o: o.__dict__))
リストをファイルに保存するには:
json.dump(strdata, f)
ファイルからリストをロードするには:
strdata = json.load(f)
元のデータ (またはdata.__dict__
プロキシ) を取得するには、 の各アイテムで json.loads を呼び出しますstrdata
。
[json.loads(item) for item in strdata]
JSON には明確に定義された形式があります。2 つの JSON 文字列を単純に連結するだけでは、有効な JSON (要素のリストなど) を作成できません。
この問題を処理するには、より洗練された方法があります。カスタム エンコーダー ( cls=CustomEncoder
) とカスタム デコーダー ( object_hook=custom_decoder
) を使用します。
import json
class Foo(object):
def __init__(self, x=1, y='bar'):
self.x = x
self.y = y
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Foo):
return obj.__dict__
else:
return json.JSONEncoder.default(self, obj)
filename = '/tmp/test.json'
with open(filename, 'w') as f:
json.dump(
[Foo(1, 'manchego'), Foo(2, 'stilton'), [{'brie': Foo(3,'gruyere')}]],
f, cls=CustomEncoder)
def custom_decoder(dct):
try:
return Foo(**dct)
except TypeError:
return dct
with open(filename, 'r') as f:
newfoo = json.load(f, object_hook=custom_decoder)
print(newfoo)
# [{"y": "manchego", "x": 1}, {"y": "stilton", "x": 2}, [{"brie": {"y": "gruyere", "x": 3}}]]
この方法の利点はjson.dump
、データを格納するために を 1 回呼び出すだけで済み、json.load
データを取得するために を 1 回呼び出すだけで済むことです。