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

我有什么:某种 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 UserWithAddressCamelCase


userWithAddressCamelCase.BaseUserCamelCase = BaseUserCamelCase(userWithAddress.BaseUser)

//I can't cast whole userWithAddressCamelCase object to another type because of different field names - BaseUser and BaseUserCamelCase

userWithAddressCamelCase.Name = userWithAddress.Name

userWithAddressCamelCase.Email = userWithAddress.Email

userWithAddressCamelCase.Postal = userWithAddress.Postal

//and so on

而且我不喜欢它,因为如果BaseUser或UserWithAddress将要长大,我必须在%CamelCase结构中添加适当的字段。


我的问题:是否有另一种更有效的方法来处理键转换?


月关宝盒
浏览 90回答 2
2回答

qq_花开花谢_0

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

汪汪一只猫

如果需要维护字段列表是您最关心的问题,那么我建议为您的用户类型创建类型别名并json.Marshaler为这些别名实现接口,您将在其中实现自定义 JSON 编码。您甚至可以引入一组替代标签并在那里使用它们。这些方面的东西:type BaseUser struct {&nbsp; &nbsp; ID&nbsp; &nbsp; int64&nbsp; `json:"user_id" jsonCC:"userId"`&nbsp; &nbsp; Name&nbsp; string `json:"user_name" jsonCC:"userName"`&nbsp; &nbsp; Email string `json:"user_email" jsonCC:"userEmail"`}type BaseUserCamelCase BaseUserfunc (bucc BaseUserCamelCase) MarshalJSON() ([]byte, error) {&nbsp; &nbsp; buccVal := reflect.ValueOf(bucc)&nbsp; &nbsp; kvpairs := []string{}&nbsp; &nbsp; for i := 0; i < buccVal.NumField(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; k := buccVal.Type().Field(i).Tag.Get("jsonCC")&nbsp; &nbsp; &nbsp; &nbsp; v := buccVal.Field(i).Interface() //TODO: proper JSON encoding of things&nbsp; &nbsp; &nbsp; &nbsp; kvpairs = append(kvpairs, fmt.Sprintf("\"%s\":%#v", k, v))&nbsp; &nbsp; }&nbsp; &nbsp; return []byte(fmt.Sprintf("{%s}", strings.Join(kvpairs, ","))), nil}然后您可以选择编组样式:user := BaseUser{&nbsp; &nbsp; ID:&nbsp; &nbsp; 123,&nbsp; &nbsp; Name:&nbsp; "Johnny D03",&nbsp; &nbsp; 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"}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go