当前位置: 首页 > 知识库问答 >
问题:

使Python json编码器支持Python的新数据类

濮阳旺
2023-03-14

从Python 3.7开始,有一种称为dataclass的东西:

from dataclasses import dataclass

@dataclass
class Foo:
    x: str

但是,以下操作失败:

>>> import json
>>> foo = Foo(x="bar")
>>> json.dumps(foo)
TypeError: Object of type Foo is not JSON serializable

如何制作json。dumps()Foo的实例编码到json对象中?

共有3个答案

盖和洽
2023-03-14

有几个选项来实现这个目标,每个选项的选择意味着分析哪种方法最适合您的需求:

import dataclasses
import json


@dataclass.dataclass
class Foo:
    x: str

foo = Foo(x='1')
json_foo = json.dumps(dataclasses.asdict(foo)) # '{"x": "1"}'

将其选回数据类实例并不简单,因此您可能希望访问该答案https://stackoverflow.com/a/53498623/2067976

from dataclasses import field
from marshmallow_dataclass import dataclass


@dataclass
class Foo:
    x: int = field(metadata={"required": True})

foo = Foo(x='1') # Foo(x='1')
json_foo = foo.Schema().dumps(foo) # '{"x": "1"}'

# Back to class instance.
Foo.Schema().loads(json_foo) # Foo(x=1)

作为marshmallow_dataclass的一个好处,您可以在字段本身使用验证,当有人使用该模式从json反序列化对象时,将使用该验证。

from dataclasses import dataclass
from dataclasses_json import dataclass_json


@dataclass_json
@dataclass
class Foo:
    x: int

foo = Foo(x='1')
json_foo = foo.to_json() # Foo(x='1')
# Back to class instance
Foo.from_json(json_foo) # Foo(x='1')

此外,请注意,marshmallow数据类为您进行了类型转换,而dataclassses json(版本:0.5.1)忽略了这一点。

按照接受的2K答案并重用自定义json编码器。

曾洲
2023-03-14

你不能只使用数据类吗。asdict()函数将数据类转换为dict?比如:

>>> @dataclass
... class Foo:
...     a: int
...     b: int
...     
>>> x = Foo(1,2)
>>> json.dumps(dataclasses.asdict(x))
'{"a": 1, "b": 2}'
姜乐家
2023-03-14

就像您可以为JSON编码器添加对datetime对象或小数的支持一样,您还可以提供自定义编码器子类来序列化数据类:

import dataclasses, json

class EnhancedJSONEncoder(json.JSONEncoder):
        def default(self, o):
            if dataclasses.is_dataclass(o):
                return dataclasses.asdict(o)
            return super().default(o)

json.dumps(foo, cls=EnhancedJSONEncoder)
 类似资料:
  • 有没有什么优雅的方法使Python JSON编码器支持datetime?一些第三方模块或简易黑客? 我正在使用tornado的数据库包装器从db获取一些行来生成一个json。查询结果包括一个常规的MySQL时间戳列。 Python默认的json编码器不支持自己的日期时间类型,这在各种数据库查询中都很常见,这很烦人。 我不想修改Python自己的json编码器。有什么好的做法吗?谢谢! ps:我通过

  • 问题内容: 有什么优雅的方法可以使Python JSON编码器支持日期时间?一些第三者模块还是容易破解? 我正在使用tornado的数据库包装程序从db获取一些行以生成json。查询结果包括一个常规的MySQL时间戳列。 令人讨厌的是,Python的默认json编码器不支持自己的日期时间类型,这种类型在所有类型的数据库查询中都很常见。 我不想修改Python自己的json编码器。有什么好的做法吗?

  • 1.16.1. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。 1.16.2. PyMySQL安装 PyMySQL下载地址:https://github.com/PyMy

  • 问题内容: 是的,我知道FAQ会假装回答此问题,但实际上并非如此。相反,它指示您从源代码构建项目(并且构建说明非常复杂)。那种打败了整个观点:) 让我们省去世界上每个人的麻烦,即不必再构建另一个开源项目,以了解它是否真正解决了他们的问题。Xuggler支持哪些编解码器? 问题答案: FAQ不能回答这个问题的原因是,随着我们发布新版本,它会不断变化,并且要使文档中的列表保持最新状态会花费很长时间。但

  • SRS哪些协议支持hevc编码 支持hevc编码的协议: rtmp httpflv hls srt: 具体见srt codec wiki FLV视频头信息 因为rtmp在2012年后,协议没有更新,对hevc编码格式的支持在rtmp协议官方文档中没有明确定义。 国内cdn厂商通过修改<video>中CodecID的定义,将flv中的hevc codecid定义为12。 Field Type Com