一个字段的Golang多个json标记名称

Wil*_*ier 8 tags json struct go

在Golang中可以为JSON结构标记使用多个名称吗?

type Animation struct {
    Name    string  `json:"name"`
    Repeat  int     `json:"repeat"`
    Speed   uint    `json:"speed"`
    Pattern Pattern `json:"pattern",json:"frames"`
}
Run Code Online (Sandbox Code Playgroud)

May*_*tel 10

对于单个字段,不允许有多个标记.在需要此类功能的情况下,您可以使用type Info map[string]interface{}而不是结构.

或者您可以在结构中使用这两种类型,并使make方法Details()返回正确的模式.

type Animation struct {
    Name    string  `json:"name"`
    Repeat  int     `json:"repeat"`
    Speed   uint    `json:"speed"`
    Pattern Pattern `json:"pattern"`
    Frame   Pattern `json:"frames"`
}

func (a Animation) Details() Pattern {
    if a.Pattern == nil {
        return a.Frame
    }
    return a.Pattern
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个很好的答案,但是 IIUC 你*不能*使用多个 json 名称标签来达到任何有用的效果。例如,`json:"pattern" json:"frames"`不会告诉`Unmarshal`解组`pattern`或`frames`。因此,也许在链接“但这并不能按您想要的方式工作”之后值得注意 (5认同)

Zha*_*ang 6

您可以将多个json标签与第三方json库一起使用,github.com/json-iterator/go 如下所示:

package main

import (
    "fmt"
    "github.com/json-iterator/go"
)

type TestJson struct {
    Name string `json:"name" newtag:"newname"`
    Age  int    `json:"age" newtag:"newage"`
}

func main() {

    var json = jsoniter.ConfigCompatibleWithStandardLibrary
    data := TestJson{}
    data.Name = "zhangsan"
    data.Age = 22
    byt, _ := json.Marshal(&data)
    fmt.Println(string(byt))

    var NewJson = jsoniter.Config{
        EscapeHTML:             true,
        SortMapKeys:            true,
        ValidateJsonRawMessage: true,
        TagKey:                 "newtag",
    }.Froze()

    byt, _ = NewJson.Marshal(&data)
    fmt.Println(string(byt))
}

output:

    {"name":"zhangsan","age":22}
    {"newname":"zhangsan","newage":22}
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用 stackoverflow!您可以通过编辑来解释您的代码的作用并告诉哪个部分是回答用户问题的关键,从而改进您的答案。 (3认同)