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

Go 使用不同的json键进行编组和解编组,go,Go,我有什么:某种API的两个结构 type BaseUser结构{ ID int64`json:“用户ID”` 名称字符串`json:“用户名”` 电子邮件字符串`json:“用户\电子邮件”` } 及 键入UserWithAddress结构{ 基本用户 邮政字符串`json:“用户\邮政”` 城市字符串`json:“用户城市”` Street字符串`json:“user_Street”` } 我想做什么:将json密钥从snake_case转换为camelCase。 比如说,这是一个请求主体

我有什么:某种API的两个结构

type BaseUser结构{
ID int64`json:“用户ID”`
名称字符串`json:“用户名”`
电子邮件字符串`json:“用户\电子邮件”`
}

键入UserWithAddress结构{
基本用户
邮政字符串`json:“用户\邮政”`
城市字符串`json:“用户城市”`
Street字符串`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"
}
我现在如何处理这个问题:我用camelCase
json
tag制作了另外两个结构

类型BaseUserCamelCase结构{
ID int64`json:“userId”`
名称字符串`json:“用户名”`
电子邮件字符串`json:“用户电子邮件”`
}

键入UserWithAddressCamelCase结构{
基本情况
邮政字符串`json:“userPostal”`
城市字符串`json:“用户城市”`
Street字符串`json:“userStreet”`
}
我的转变看起来像

var userWithAddressCamelCase userWithAddressCamelCase
userWithAddressCamelCase.BaseUserCamelCase=BaseUserCamelCase(userWithAddress.BaseUser)
//我无法将整个userWithAddressCamelCase对象强制转换为另一种类型,因为字段名不同-BaseUser和BaseUserCamelCase
userWithAddressCamelCase.Name=userWithAddress.Name
userWithAddressCamelCase.Email=userWithAddress.Email
userWithAddressCamelCase.Postal=userWithAddress.Postal
//等等
我不喜欢它,因为如果
BaseUser
UserWithAddress
长大了,我必须向
%CamelCase
结构添加适当的字段

我的问题:还有其他更有效的方法来处理密钥转换吗

还有其他更有效的方法来处理密钥转换吗

没有

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

还有其他更有效的方法来处理密钥转换吗

没有


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

如果您最关心的是维护字段列表的需要,那么我建议为您的用户类型创建类型别名,并为这些别名实现
json.Marshaler
接口,在这里您可以实现自定义json编码。您甚至可以引入一组替代标记并在那里使用它们

大致如下:

type BaseUser结构{
ID int64`json:“用户ID”jsonCC:“用户ID”`
名称字符串`json:“用户名”jsonCC:“用户名”`
电子邮件字符串`json:“用户电子邮件”jsonCC:“用户电子邮件”`
}
类型BaseUserCamelCase BaseUser
func(bucc BaseUserCamelCase)MarshalJSON()([]字节,错误){
buccVal:=反射值(bucc)
kvpairs:=[]字符串{}
对于i:=0;i
然后可以选择封送处理样式:

user:=BaseUser{
ID:123,
姓名:“约翰尼D03”,
电子邮件:“j@example.com",
}
json.Marshal(用户)
//{“用户id”:123,“用户名称”:“约翰尼D03”,“用户电子邮件”:j@example.com"}
json.Marshal(BaseUserCamelCase(用户))
//{“userId”:123,“userName”:“Johnny D03”,“userEmail”:j@example.com"}

如果您最关心的是维护字段列表的需要,那么我建议为您的用户类型创建类型别名,并为这些别名实现
json.Marshaler
接口,在这里您可以实现自定义json编码。您甚至可以引入一组替代标记并在那里使用它们

大致如下:

type BaseUser结构{
ID int64`json:“用户ID”jsonCC:“用户ID”`
名称字符串`json:“用户名”jsonCC:“用户名”`
电子邮件字符串`json:“用户电子邮件”jsonCC:“用户电子邮件”`
}
类型BaseUserCamelCase BaseUser
func(bucc BaseUserCamelCase)MarshalJSON()([]字节,错误){
buccVal:=反射值(bucc)
kvpairs:=[]字符串{}
对于i:=0;i
然后可以选择封送处理样式:

user:=BaseUser{
ID:123,
姓名:“约翰尼D03”,
电子邮件:“j@example.com",
}
json.Marshal(用户)
//{“用户id”:123,“用户名称”:“约翰尼D03”,“用户电子邮件”:j@example.com"}
json.Marshal(BaseUserCamelCase(用户))
//{“userId”:123,“userName”:“Johnny D03”,“userEmail”:j@example.com"}
我可以问问为什么吗?在我看来,相同的数据应该在API中一致地表示,无论是请求格式还是响应,最好用相同的名称表示相同的值。除此之外,我可能会实现
Marshaller
接口来完成这种工作