2

次の行に沿ってdatetime.datetimeオブジェクトとnamedtuplesを含むネストされたPythonデータ構造があります。

from datetime import datetime as dt
from datetime import timedelta
from collections import namedtuple
nt = namedtuple('n', 'name, contact')
f1 = nt('jules', '1234')
f2 = nt('dan', '5678')
x = [
    [dt.now() + timedelta(minutes=1), f1],
    [dt.now() + timedelta(hours=1), f2],
    ]

エンコーダーは次のようなものです。

import json
class TestEncoder(json.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'isoformat'):
            return obj.isoformat()
        else:
            return json.JSONEncoder.default(self, obj)

print json.dumps(x, cls=TestEncoder)出力:

[["2012-06-21T00:48:03.296381", ["jules", "1234"]],
 ["2012-06-21T01:47:03.296423", ["dan", "5678"]]]

._asdict()次の出力を取得するために、namedtuplesをdictに変換したいと思います(おそらくnamedtupleメソッドを使用します)。

[["2012-06-21T00:48:03.296381", {"name":"jules", "contact":"1234"}],
 ["2012-06-21T01:47:03.296423", {"name":"dan", "contact":"5678"}]]

一般的なデータ構造を保持するにはどうすればよいですか?jsonはnamedtuplesをdictとしてダンプしますか?

4

2 に答える 2

5

ドキュメントを読み直した後、これは組み込みのjsonlibを使用して不可能であるように見えます。これは、唯一のオーバーライドメカニズム(default)が既知のタイプ(タプルを含む)の後にのみ呼び出されるためです。

simplejsonnamedtuple_as_objectあなたにフラグを与えることによってこれを些細なものにしますsimplejson.dump

simplejson.dumps(x, cls=TestEncoder, namedtuple_as_object=True)
于 2012-06-21T00:41:56.347 に答える
0

これを行うためのPythonモジュールを作成しました。というtypedload

興味深いのは、それが双方向に行われることです。そのため、jsonから、jsonと型を渡すだけでPythonオブジェクトに戻ることができます。

import typedload
typedload.dump(data)
于 2018-09-19T21:28:48.427 に答える