首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Python namedtuple序列化为json

将Python namedtuple序列化为json
EN

Stack Overflow用户
提问于 2011-05-06 12:34:57
回答 9查看 51.1K关注 0票数 100

在保留字段名的情况下将namedtuple序列化为json的推荐方法是什么?

namedtuple序列化为json只会导致序列化的值和字段名在转换过程中丢失。我希望这些字段在json化时也能保留下来,因此可以这样做:

代码语言:javascript
复制
class foobar(namedtuple('f', 'foo, bar')):
    __slots__ = ()
    def __iter__(self):
        yield self._asdict()

上面的代码按照我的预期序列化为json,并且在我使用的其他地方(属性访问等)表现为namedtuple,除了在迭代它时使用非元组之类的结果(这对我的用例来说很好)。

在保留字段名的情况下,转换为json的“正确方式”是什么?

EN

回答 9

Stack Overflow用户

发布于 2013-04-04 07:55:53

如果它只是一个你想序列化的namedtuple,使用它的_asdict()方法就可以了(使用Python >= 2.7)

代码语言:javascript
复制
>>> from collections import namedtuple
>>> import json
>>> FB = namedtuple("FB", ("foo", "bar"))
>>> fb = FB(123, 456)
>>> json.dumps(fb._asdict())
'{"foo": 123, "bar": 456}'
票数 90
EN

Stack Overflow用户

发布于 2018-04-08 06:20:22

为此,我编写了一个库:https://github.com/ltworf/typedload

它可以在命名元组之间来回切换。

它支持非常复杂的嵌套结构,包括列表、集合、枚举、联合、默认值。它应该涵盖最常见的情况。

编辑:该库还支持dataclass和attr类。

票数 6
EN

Stack Overflow用户

发布于 2018-03-22 21:08:52

它递归地将namedTuple数据转换为json。

代码语言:javascript
复制
print(m1)
## Message(id=2, agent=Agent(id=1, first_name='asd', last_name='asd', mail='2@mai.com'), customer=Customer(id=1, first_name='asd', last_name='asd', mail='2@mai.com', phone_number=123123), type='image', content='text', media_url='h.com', la=123123, ls=4512313)

def reqursive_to_json(obj):
    _json = {}

    if isinstance(obj, tuple):
        datas = obj._asdict()
        for data in datas:
            if isinstance(datas[data], tuple):
                _json[data] = (reqursive_to_json(datas[data]))
            else:
                 print(datas[data])
                _json[data] = (datas[data])
    return _json

data = reqursive_to_json(m1)
print(data)
{'agent': {'first_name': 'asd',
'last_name': 'asd',
'mail': '2@mai.com',
'id': 1},
'content': 'text',
'customer': {'first_name': 'asd',
'last_name': 'asd',
'mail': '2@mai.com',
'phone_number': 123123,
'id': 1},
'id': 2,
'la': 123123,
'ls': 4512313,
'media_url': 'h.com',
'type': 'image'}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5906831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档