在保留字段名的情况下将namedtuple
序列化为json的推荐方法是什么?
将namedtuple
序列化为json只会导致序列化的值和字段名在转换过程中丢失。我希望这些字段在json化时也能保留下来,因此可以这样做:
class foobar(namedtuple('f', 'foo, bar')):
__slots__ = ()
def __iter__(self):
yield self._asdict()
上面的代码按照我的预期序列化为json,并且在我使用的其他地方(属性访问等)表现为namedtuple
,除了在迭代它时使用非元组之类的结果(这对我的用例来说很好)。
在保留字段名的情况下,转换为json的“正确方式”是什么?
发布于 2013-04-04 07:55:53
如果它只是一个你想序列化的namedtuple
,使用它的_asdict()
方法就可以了(使用Python >= 2.7)
>>> from collections import namedtuple
>>> import json
>>> FB = namedtuple("FB", ("foo", "bar"))
>>> fb = FB(123, 456)
>>> json.dumps(fb._asdict())
'{"foo": 123, "bar": 456}'
发布于 2018-04-08 06:20:22
为此,我编写了一个库:https://github.com/ltworf/typedload
它可以在命名元组之间来回切换。
它支持非常复杂的嵌套结构,包括列表、集合、枚举、联合、默认值。它应该涵盖最常见的情况。
编辑:该库还支持dataclass和attr类。
发布于 2018-03-22 21:08:52
它递归地将namedTuple数据转换为json。
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'}
https://stackoverflow.com/questions/5906831
复制相似问题