1
strdata = strdata + json.dumps(data, default=lambda o: o.__dict__)

これを使用して、さまざまな API 呼び出しからの json データを文字列に連結しています。

今、データを読みたい/変数「strdata」をjson形式にロードしたいときは、

json.loads(strdata)

しかし、うまくいきません。シリアル化された文字列を別の文字列と連結していることを考えると、最初に strdata 全体をダンプしてから再度ロードする必要があると思います。しかし、それもうまくいきません。

4

1 に答える 1

4

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 回呼び出すだけで済むことです。

于 2013-05-26T15:55:13.473 に答える