为了账号安全,请及时绑定邮箱和手机立即绑定

使用不同的 json 键进行编组和解组

使用不同的 json 键进行编组和解组

Go
月关宝盒 2022-05-23 16:58:11
我有什么:某种 API 的两个结构type BaseUser struct {    ID    int64  `json:"user_id"`    Name  string `json:"user_name"`    Email string `json:"user_email"`}和type UserWithAddress struct {    BaseUser    Postal string `json:"user_postal"`    City   string `json:"user_city"`    Street string `json:"user_street"`}我想做什么:将json键从snake_case转换为camelCase。可以说,这是一个请求正文{    "user_id": 123,    "user_name": "test",    "user_email": "test@mail.com",    "user_postal": "12312",    "user_city": "city",    "user_street": "street"}因此,经过某种转换,我想要这个输出{    "userId": 123,    "userName": "test",    "userEmail": "test@mail.com",    "userPostal": "12312",    "userCity": "city",    "userStreet": "street"}目前我该如何处理:我用 camelCasejson标签制作了另外两个结构type BaseUserCamelCase struct {    ID    int64  `json:"userId"`    Name  string `json:"userName"`    Email string `json:"userEmail"`}和type UserWithAddressCamelCase struct {    BaseUserCamelCase    Postal string `json:"userPostal"`    City   string `json:"userCity"`    Street string `json:"userStreet"`}我的转变看起来像var userWithAddressCamelCase UserWithAddressCamelCaseuserWithAddressCamelCase.BaseUserCamelCase = BaseUserCamelCase(userWithAddress.BaseUser)//I can't cast whole userWithAddressCamelCase object to another type because of different field names - BaseUser and BaseUserCamelCaseuserWithAddressCamelCase.Name = userWithAddress.NameuserWithAddressCamelCase.Email = userWithAddress.EmailuserWithAddressCamelCase.Postal = userWithAddress.Postal//and so on而且我不喜欢它,因为如果BaseUser或UserWithAddress将要长大,我必须在%CamelCase结构中添加适当的字段。我的问题:是否有另一种更有效的方法来处理键转换?
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

还有另一种更有效的方法来处理键转换吗?

不。

(嗯,根据你对“高效”的定义。你可以使用反射,但我不推荐这个。你的代码非常好。如果有任何结构增长,你添加几行简单的代码。简单的代码没有错这不会产生错误并且在执行过程中很快。仅仅因为它看起来并不花哨,并不意味着这里有什么需要“改进”的。)



查看完整回答
反对 回复 2022-05-23
?
汪汪一只猫

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"}


查看完整回答
反对 回复 2022-05-23
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信