
比如下面的 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 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 会提示 |