比如下面的 Go 结构体:
type CompanyBase struct {
// ID id
ID int64 `json:"id" db:"id"`
// Name 名称
Name string `json:"name" db:"title"`
// Deleted 逻辑删除标志。0 为未删除。1 为已删除
Deleted bool `json:"deleted" db:"deleted"`
// CreateTime 创建时间
CreateTime time.Time `json:"create_time" db:"create_time"`
// UpdateTime 更新时间
UpdateTime time.Time `json:"update_time" db:"update_time"`
}
上面结构体字段 tag ,json 用于 json 序列化和反序列化,db 用于数据库序列化和反序列化。
还可以加别的标签,实现校验。这个例子没有。
当然,得有一个库,读取字段标签,执行序列化、反序列化、校验等功能。
另外,还得支持嵌套结构。
如果换了是 python ,怎么实现?
1
ruanimal 2023-02-25 09:19:24 +08:00 1
Pydantic
|
2
dearmymy 2023-02-25 09:21:59 +08:00
dataclass ,搜下就好。
应该可以适合大部分情况了。 |
3
daytonight 2023-02-25 10:13:27 +08:00
marshmallow
|
4
di94sh 2023-02-25 10:32:04 +08:00 via iPhone
python 这边是 dict 转一切 pydantic 一把梭
|
5
FarmerChillax 2023-02-25 23:52:22 +08:00
marshmallow 和 Pydantic 都可以
|
6
matrix1010 2023-02-26 14:18:28 +08:00
通过 tag 真的好吗,我很反感这种通过 string 注释来完成逻辑的方式. 很有可能你会手滑打错什么的。go 有个 library 叫 ozzo-validation: https://github.com/go-ozzo/ozzo-validation. 就是专门为了避免这种 tag validate 方式: "use normal programming constructs rather than error-prone struct tags to specify how data should be validated."
|
7
siteshen 2023-02-26 16:25:44 +08:00
# 实现一个呗:
class UnderScoreJsonFieldMixin: def json_name(self): return to_cunderscore(self.name) class Field: def __init__(self, name): pass def json_name(field_type): return name.upper() class IntField(Field): pass class StringField(Field): pass class User: name = StringField("name") age = IntField("age") def __init__(self, name, age): self.name = name self.age = age def json(self): return { self.name.json_name(): self.name, self.age.json_name(): self.age, } |
8
1800x OP @matrix1010 手打滑的概率很低。如果真的打滑了,vscode 会提示
|