2

我有一个嵌套的 Python 数据结构,其中包含 datetime.datetime 对象和 namedtuples,如下所示:

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"]]]

我想将 namedtuple 转换为 dicts(大概使用 namedtuple._asdict()方法),以获得以下输出:

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

如何保留一般数据结构,但 json 将命名元组转储为 dicts?

4

2 回答 2

5

重新阅读文档后,使用内置jsonlib 似乎是不可能的,因为唯一的覆盖机制 ( default) 仅在已知类型(包括元组)之后调用

simplejson通过给你一个namedtuple_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 回答