2 回答
TA贡献1835条经验 获得超7个赞
还有另一种更有效的方法来处理键转换吗?
不。
(嗯,根据你对“高效”的定义。你可以使用反射,但我不推荐这个。你的代码非常好。如果有任何结构增长,你添加几行简单的代码。简单的代码没有错这不会产生错误并且在执行过程中很快。仅仅因为它看起来并不花哨,并不意味着这里有什么需要“改进”的。)
TA贡献1898条经验 获得超8个赞
如果需要维护字段列表是您最关心的问题,那么我建议为您的用户类型创建类型别名并json.Marshaler为这些别名实现接口,您将在其中实现自定义 JSON 编码。您甚至可以引入一组替代标签并在那里使用它们。
这些方面的东西:
type BaseUser struct {
ID int64 `json:"user_id" jsonCC:"userId"`
Name string `json:"user_name" jsonCC:"userName"`
Email string `json:"user_email" jsonCC:"userEmail"`
}
type BaseUserCamelCase BaseUser
func (bucc BaseUserCamelCase) MarshalJSON() ([]byte, error) {
buccVal := reflect.ValueOf(bucc)
kvpairs := []string{}
for i := 0; i < buccVal.NumField(); i++ {
k := buccVal.Type().Field(i).Tag.Get("jsonCC")
v := buccVal.Field(i).Interface() //TODO: proper JSON encoding of things
kvpairs = append(kvpairs, fmt.Sprintf("\"%s\":%#v", k, v))
}
return []byte(fmt.Sprintf("{%s}", strings.Join(kvpairs, ","))), nil
}
然后您可以选择编组样式:
user := BaseUser{
ID: 123,
Name: "Johnny D03",
Email: "j@example.com",
}
json.Marshal(user)
// {"user_id":123,"user_name":"Johnny D03","user_email":"j@example.com"}
json.Marshal(BaseUserCamelCase(user))
// {"userId":123,"userName":"Johnny D03","userEmail":"j@example.com"}
- 2 回答
- 0 关注
- 89 浏览
添加回答
举报