从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对象中?
有几个选项来实现这个目标,每个选项的选择意味着分析哪种方法最适合您的需求:
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编码器。
你不能只使用数据类吗。asdict()
函数将数据类转换为dict?比如:
>>> @dataclass
... class Foo:
... a: int
... b: int
...
>>> x = Foo(1,2)
>>> json.dumps(dataclasses.asdict(x))
'{"a": 1, "b": 2}'
就像您可以为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