mir*_*e2k 23 python python-dataclasses
从Python 3.7开始,有一种称为数据类的东西:
from dataclasses import dataclass
@dataclass
class Foo:
x: str
Run Code Online (Sandbox Code Playgroud)
但是,以下失败:
>>> import json
>>> foo = Foo(x="bar")
>>> json.dumps(foo)
TypeError: Object of type Foo is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
如何将json.dumps()编码实例Foo转换为json 对象?
mir*_*e2k 35
就像您可以为datetime对象或Decimal 添加对JSON编码器的支持一样,您还可以提供自定义编码器子类来序列化数据类:
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)
Run Code Online (Sandbox Code Playgroud)
And*_*yko 21
有几个选项可以实现该目标,选择每个选项意味着分析哪种方法最适合您的需求:
import dataclasses
import json
@dataclass.dataclass
class Foo:
x: str
foo = Foo(x='1')
json_foo = json.dumps(dataclasses.asdict(foo)) # '{"x": "1"}'
Run Code Online (Sandbox Code Playgroud)
将它选回数据类实例并非易事,因此您可能想访问该答案/sf/answers/3744903641/
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)
Run Code Online (Sandbox Code Playgroud)
作为奖励,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')
Run Code Online (Sandbox Code Playgroud)
此外,除此之外,棉花糖数据类为您进行了类型转换,而 dataclassses-json(ver.: 0.5.1) 忽略了这一点。
遵循接受的奇迹 2k 答案并重用自定义 json 编码器。
Ren*_*ene 15
您还可以在类中实现asdictand方法。json.dumps在这种情况下,无需导入json.dumps到项目的其他部分:
from typing import List
from dataclasses import dataclass, asdict, field
from json import dumps
@dataclass
class TestDataClass:
"""
Data Class for TestDataClass
"""
id: int
name: str
tested: bool = False
test_list: List[str] = field(default_factory=list)
@property
def __dict__(self):
"""
get a python dictionary
"""
return asdict(self)
@property
def json(self):
"""
get the json formated string
"""
return dumps(self.__dict__)
test_object_1 = TestDataClass(id=1, name="Hi")
print(test_object_1.__dict__)
print(test_object_1.json)
Run Code Online (Sandbox Code Playgroud)
输出:
{'id': 1, 'name': 'Hi', 'tested': False, 'test_list': []}
{"id": 1, "name": "Hi", "tested": false, "test_list": []}
Run Code Online (Sandbox Code Playgroud)
您还可以创建一个父类来继承这些方法:
{'id': 1, 'name': 'Hi', 'tested': False, 'test_list': []}
{"id": 1, "name": "Hi", "tested": false, "test_list": []}
Run Code Online (Sandbox Code Playgroud)
mrt*_*rts 12
dataclass编码和对象的最简单方法SimpleNamespace是提供默认函数,以便json.dumps()为无法序列化的对象调用该函数,并返回该对象__dict__:
json.dumps(foo, default=lambda o: o.__dict__)
Run Code Online (Sandbox Code Playgroud)
Jun*_*ius 11
如果您可以使用库来实现此目的,则可以使用dataclasses-json。这是一个例子:
from dataclasses import dataclass
from dataclasses_json import dataclass_json
@dataclass_json
@dataclass
class Foo:
x: str
foo = Foo(x="some-string")
foo_json = foo.to_json()
Run Code Online (Sandbox Code Playgroud)
它还支持嵌入式数据类- 如果您的数据类有一个类型为另一个数据类的字段 - 如果涉及的所有数据类都有@dataclass_json装饰器。
Phi*_*pak 11
我建议使用以下to_json()方法为您的数据类创建一个父类:
import json
from dataclasses import dataclass, asdict
@dataclass
class Dataclass:
def to_json(self) -> str:
return json.dumps(asdict(self))
@dataclass
class YourDataclass(Dataclass):
a: int
b: int
x = YourDataclass(a=1, b=2)
x.to_json() # '{"a": 1, "b": 2}'
Run Code Online (Sandbox Code Playgroud)
如果您有其他功能要添加到所有数据类中,这尤其有用。
Chu*_*ers 10
您不能只使用dataclasses.asdict()函数将数据类转换为dict吗?就像是:
>>> @dataclass
... class Foo:
... a: int
... b: int
...
>>> x = Foo(1,2)
>>> json.dumps(dataclasses.asdict(x))
'{"a": 1, "b": 2}'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6438 次 |
| 最近记录: |