Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Go中使用不同的json标记将json从一个结构打包到另一个结构?_Json_Go_Struct_Marshalling - Fatal编程技术网

如何在Go中使用不同的json标记将json从一个结构打包到另一个结构?

如何在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

我正在创建一个Go应用程序,它使用来自多个数据源的数据,这些数据源都具有相似的数据,但其数据/响应的结构不同。这些响应需要编组到一个公共结构中,然后发送到另一个服务

公共结构:

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字段