【发布时间】:2018-06-07 19:31:51
【问题描述】:
我们得到一些 JSON 输入,解组,执行一些工作,然后编组并发送到其他地方。我们得到的 JSON 可能有一个名为“user”的字段。当我们编组回 JSON 时,我们需要将该字段“用户”更改为“用户名”。我们可以通过创建一个具有所有相同字段但不同 JSON 标签的新结构来做到这一点,但这似乎有点麻烦。我以为自定义编组器会在这里工作,但我有点卡住了。考虑以下代码。
package main
import (
"encoding/json"
"fmt"
)
type StructA struct {
Username string `json:"user"`
Process string `json:"process"`
}
func main() {
var test1 StructA
err := json.Unmarshal([]byte(`{"user": "user123", "process": "something"}`), &test1)
if err != nil {
fmt.Println(err)
}
// do some work with test1
jsonByte, err := json.Marshal(&test1)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(jsonByte))
}
func (u *StructA) MarshalJSON() ([]byte, error) {
type Alias StructA
return json.Marshal(&struct {
Username string `json:"username"`
*Alias
}{
Username: u.Username,
Alias: (*Alias)(u),
})
}
https://play.golang.org/p/_w0rlQrcgrW
理想情况下,这将允许我将该字段上的 JSON 标记从“用户”更改为“用户名”。但是,我得到了“用户名”和“用户”。
{"username":"user123","user":"user123","process":"something"}
我当然可以创建一个全新的结构,用我想要的标签来镜像 StructA,但我不必复制每个字段并担心保持这两个结构同步。这不是世界末日,但似乎不是一个好方法。
明确地说,我正在寻找的最终结果如下:
{"username":"user123","process":"something"}
我确定我在这里遗漏了一些琐碎的事情,但这是漫长的一周,我们将不胜感激。谢谢!
【问题讨论】:
-
你得到的结果是因为你在创建一个新的编组时嵌入了结构。你已经嵌入了整个
StructA。