当前位置: 首页 > 面试题库 >

将Python namedtuple序列化为json

程招
2023-03-14
问题内容

建议namedtuple使用保留的字段名称将a序列化为json
的建议方式是什么?

将a namedtuple序列化为json只会导致值被序列化,并且字段名称在转换中会丢失。我希望在json大小化时也保留这些字段,因此请执行以下操作:

class foobar(namedtuple('f', 'foo, bar')):
    __slots__ = ()
    def __iter__(self):
        yield self._asdict()

上面的代码按照我的期望序列化为json,并且namedtuple在我使用的其他地方(属性访问等)中起作用,除了在迭代过程中出现非元组之类的结果外(对于我的用例来说这很好)。

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


问题答案:

这非常棘手,因为这namedtuple()是一个工厂,该工厂返回从派生的新类型tuple。一种方法是让您的类也继承自UserDict.DictMixin,但tuple.__getitem__已经定义了,并且需要一个整数来表示元素的位置,而不是其属性的名称:

>>> f = foobar('a', 1)
>>> f[0]
'a'

从本质上讲,namedtuple非常适合JSON,因为它实际上是一种 自定义类型,其键名在类型定义中是固定的
,而字典中的键名存储在实例中。这可以防止您“往返”一个命名元组,例如,在没有其他信息的情况下,您无法将字典解码回一个命名元组,例如dict中的特定于应用程序的类型标记{'a': 1, '#_type': 'foobar'},这有点麻烦。

这不是理想的方法,但是 如果您只需要将 namedtuple 编码
为字典,则另一种方法是将JSON编码器扩展或修改为特殊类型的这些类型。这是Python的子类化示例json.JSONEncoder。这解决了确保嵌套的命名元组正确转换为字典的问题:

from collections import namedtuple
from json import JSONEncoder

class MyEncoder(JSONEncoder):

    def _iterencode(self, obj, markers=None):
        if isinstance(obj, tuple) and hasattr(obj, '_asdict'):
            gen = self._iterencode_dict(obj._asdict(), markers)
        else:
            gen = JSONEncoder._iterencode(self, obj, markers)
        for chunk in gen:
            yield chunk

class foobar(namedtuple('f', 'foo, bar')):
    pass

enc = MyEncoder()
for obj in (foobar('a', 1), ('a', 1), {'outer': foobar('x', 'y')}):
    print enc.encode(obj)

{"foo": "a", "bar": 1}
["a", 1]
{"outer": {"foo": "x", "bar": "y"}}


 类似资料:
  • 问题内容: 我正在客户端和Django服务器之间发送信息,并且我想对此使用JSON。我正在发送简单的信息-字符串列表。我尝试使用,但是当我这样做时, 看来这只能用于Django对象。如何序列化简单的Python对象? 问题答案: 你可以使用纯Python执行此操作:

  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 问题内容: 如何在JavaScript中将对象序列化为JSON? 问题答案: 您正在寻找。

  • 问题内容: 我需要将Objective- C对象序列化和反序列化为JSON以存储在CouchDB中。人们是否有通用解决方案最佳实践的示例代码?我看了几个JSON框架,它们在NSDictionary / NSArray级别停止了。即,许多框架会将NSDictionary / NSArray序列化和反序列化为JSON。但是我仍然要做将NSDictionary转换为Objective-C对象的工作。 为

  • 问题内容: 我想通过实施将其序列化为Json 该映射序列化为非标准。我想在单元测试中测试此行为。 问题答案: 你不能像这样测试。你在这里做什么 正在建立 出站 响应。在JAX-RS框架中,发出响应后,例如 它仍然需要通过序列化到JSON。 阅读有关实体提供者的更多信息 话虽如此,泽西岛有一个测试框架,我们可以用来测试我们的资源方法。您可以在Github上找到所有官方示例 一个样本(有一些改动):

  • 问题内容: 如何将Python 成员序列化为JSON,以便可以将生成的JSON反序列化为Python对象? 例如,此代码: 导致错误: 我该如何避免呢? 问题答案: 如果您想将任意成员编码为JSON,然后将其解码为相同的枚举成员(而不是简单的枚举成员的属性),则可以编写一个自定义类,并使用一个解码函数作为参数传递给or来实现。: 该函数依赖于已使用或类似行为进行编码的JSON 。 对成员的限制是必