如何在Go中使用不同的json标记将json从一个结构打包到另一个结构?
我正在创建一个Go应用程序,它使用来自多个数据源的数据,这些数据源都具有相似的数据,但其数据/响应的结构不同。这些响应需要编组到一个公共结构中,然后发送到另一个服务 公共结构:如何在Go中使用不同的json标记将json从一个结构打包到另一个结构?,json,go,struct,marshalling,Json,Go,Struct,Marshalling,我正在创建一个Go应用程序,它使用来自多个数据源的数据,这些数据源都具有相似的数据,但其数据/响应的结构不同。这些响应需要编组到一个公共结构中,然后发送到另一个服务 公共结构: type common struct { ID string `json:id` GivenName string `json:given_name` FamilyName string `json:family_name` Email: string `json:ema
type common struct {
ID string `json:id`
GivenName string `json:given_name`
FamilyName string `json:family_name`
Email: string `json:email`
}
一个答复是:
{
"id": "123",
"first_name": "john",
"last_name": "smith",
"email": "js@mail.com"
}
{
"id": "456",
"first": "larry",
"last": "smith",
"email": {
"primary": "larry@mail.com"
}
}
另一项答复:
{
"id": "123",
"first_name": "john",
"last_name": "smith",
"email": "js@mail.com"
}
{
"id": "456",
"first": "larry",
"last": "smith",
"email": {
"primary": "larry@mail.com"
}
}
如何将一个结构的json响应封送到另一个结构的结构中?我认为您可以根据不同的源定义不同的结构。然后,将其转换为通用结构 此方法灵活、可读,并且在添加新源时易于实现 示例代码如下所示:
主程序包
进口(
“编码/json”
“fmt”
)
类型用户结构{
ID字符串`json:ID`
GiveName字符串`json:gived_name`
FamilyName字符串`json:family\u name`
电子邮件字符串`json:Email`
}
输入UserFromMySQL结构{
ID字符串`json:“ID”`
FirstName字符串`json:“first_name”`
LastName字符串`json:“姓氏”`
电子邮件字符串`json:“电子邮件”`
}
func(u*UserFromMySQL)GetUser()*User{
返回和用户{
ID:u.ID,
GiveName:u.FirstName,
FamilyName:u.LastName,
电子邮件:美国电子邮件,
}
}
func main(){
um:=new(UserFromMySQL)
b:=[]字节(`{
“id”:“123”,
“名字”:“约翰”,
“姓氏”:“史密斯”,
“电子邮件”:js@mail.com"
}`)
err:=json.Unmarshal(b,um)
如果错误!=零{
恐慌(错误)
}
fmt.Printf(“%+v\n”,um)
fmt.Printf(“%+v\n”,um.GetUser())
}
当然,您可以通过添加冗余字段来做到这一点,如下定义user
:
键入电子邮件{
主字符串`json:“主”`
}
类型用户结构{
ID字符串`json:“ID”`
GiveName字符串`json:“给定名称”`
FamilyName字符串`json:“family_name”`
FirstName字符串`json:“姓氏”`
LastName字符串`json:“姓氏”`
电子邮件字符串`json:“电子邮件”`
}
为你选择正确的道路。我更喜欢第一个。我认为您可以根据不同的来源定义不同的结构。然后,将其转换为通用结构 此方法灵活、可读,并且在添加新源时易于实现 示例代码如下所示:
主程序包
进口(
“编码/json”
“fmt”
)
类型用户结构{
ID字符串`json:ID`
GiveName字符串`json:gived_name`
FamilyName字符串`json:family\u name`
电子邮件字符串`json:Email`
}
输入UserFromMySQL结构{
ID字符串`json:“ID”`
FirstName字符串`json:“first_name”`
LastName字符串`json:“姓氏”`
电子邮件字符串`json:“电子邮件”`
}
func(u*UserFromMySQL)GetUser()*User{
返回和用户{
ID:u.ID,
GiveName:u.FirstName,
FamilyName:u.LastName,
电子邮件:美国电子邮件,
}
}
func main(){
um:=new(UserFromMySQL)
b:=[]字节(`{
“id”:“123”,
“名字”:“约翰”,
“姓氏”:“史密斯”,
“电子邮件”:js@mail.com"
}`)
err:=json.Unmarshal(b,um)
如果错误!=零{
恐慌(错误)
}
fmt.Printf(“%+v\n”,um)
fmt.Printf(“%+v\n”,um.GetUser())
}
当然,您可以通过添加冗余字段来做到这一点,如下定义user
:
键入电子邮件{
主字符串`json:“主”`
}
类型用户结构{
ID字符串`json:“ID”`
GiveName字符串`json:“给定名称”`
FamilyName字符串`json:“family_name”`
FirstName字符串`json:“姓氏”`
LastName字符串`json:“姓氏”`
电子邮件字符串`json:“电子邮件”`
}
为你选择正确的道路。我更喜欢第一个。我建议您将每个数据的结构分开 Golang是一种强类型语言,因此每个结构只应表示一种数据类型。这不仅消除了关岛代码,还减少了其他开发人员跟踪数据类型所需的时间,这种情况有时发生在Python等非强类型语言中 无论如何,如果您确实需要在同一个结构中表示这些数据,您可以编写如下代码
类型用户结构{
ID字符串`json:“ID,省略空”`
GivenName字符串`json:“给定名称,省略为空”`
FamilyName字符串`json:“family_name,省略为空”`
FirstName字符串`json:“first,empty”`
LastName字符串`json:“last,empty”`
PlainEmail字符串`json:“plain_email,省略为空”`
电子邮件结构{
主字符串`json:“主”`
}`json:“电子邮件,省略空”`
}
在JSON标记中添加omitempty,因此如果使用用户类型A创建结构,那么类型B字段将不会在JSON中表示。然而,我不推荐这种方法,但如果你需要,这就是方法
无论如何,需要将Email和PlainEmail JSON标记分开,否则编译器会被混淆。我建议您将每个数据的结构分开 Golang是一种强类型语言,因此每个结构只应表示一种数据类型。这不仅消除了关岛代码,还减少了其他开发人员跟踪数据类型所需的时间,这种情况有时发生在Python等非强类型语言中 无论如何,如果您确实需要在同一个结构中表示这些数据,您可以编写如下代码
类型用户结构{
ID字符串`json:“ID,省略空”`
GivenName字符串`json:“给定名称,省略为空”`
FamilyName字符串`json:“family_name,省略为空”`
FirstName字符串`json:“first,empty”`
LastName字符串`json:“last,empty”`
PlainEmail字符串`json:“plain_email,省略为空”`
电子邮件结构{
主字符串`json:“主”`
}`json:“电子邮件,省略空”`
}
在JSON标记中添加omitempty,因此如果使用用户类型A创建结构,则类型B字段