Golang - 覆盖嵌入字段的 JSON 标签

Jor*_*dan 3 json struct go

假设我有以下类型:

type Inner struct {
    Field1 string `json:"field1"`
    Field2 string `json:"field2"`
}

type Outer struct {
    Inner 
    Field2 string `json:"-"`
}
Run Code Online (Sandbox Code Playgroud)

我试图通过此实现的目的是允许拥有一种类型 ( Outer),该类型 ( ) 包含嵌入类型 ( ) 中的所有字段Inner,但覆盖其中一个字段,使其不被编组到 JSON 中。这不起作用,调用json.Marshal(Outer{})返回:

{"field1":"","field2":""}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在 Go 中执行此操作并返回此值吗?

{"field1":""}
Run Code Online (Sandbox Code Playgroud)

Bri*_*its 6

你可以这样做(关键是输出标签具有相同的名称):

type Inner struct {
    Field1 string `json:"field1"`
    Field2 string `json:"field2"`
}

type Outer struct {
    Inner
    NameDoesNotMatter string `json:"field2,omitempty"`
}

func main() {
    j, err := json.Marshal(Outer{})
    if err != nil {
        panic(err)
    }
    fmt.Printf("1: %s\n", j)

    v := Inner{
        Field1: "foo",
        Field2: "bar",
    }
    j, err = json.Marshal(Outer{Inner: v})
    if err != nil {
        panic(err)
    }
    fmt.Printf("2: %s\n", j)
}
Run Code Online (Sandbox Code Playgroud)

输出:

1: {"field1":""}
2: {"field1":"foo"}
Run Code Online (Sandbox Code Playgroud)

在研究如何使用结构组合操作 JSON 输出时,我发现这篇文章非常有用。