英文:
Golang variable inside json field tag
问题
有没有办法动态地更改结构体字段的标签?
key := "mykey"
// 类似于以下结构体定义
MyStruct struct {
field `json:key` // 或者 field `json:$key`
}
// 我想要以下输出
{
"mykey": 5
}
在文档中没有找到相关内容。
英文:
Is there a way to change structs field tag dynamicly?
key := "mykey"
// a struct definition like
MyStruct struct {
field `json:key` //or field `json:$key`
}
// I want the following output
{
"mykey": 5
}
Couldn't find anything in the documentation.
答案1
得分: 5
你可以通过实现json.Marshaler
接口来自定义类型的编组方式。这将覆盖默认行为,不再自动检查结构体的字段。
对于这个特定的例子,你可以这样做:
func (s MyStruct) MarshalJSON() ([]byte, error) {
data := map[string]interface{}{
key: s.field,
}
return json.Marshal(data)
}
在这里,我构建了一个map[string]interface{}
值,表示我想要在JSON输出中的内容,并将其传递给json.Marshal
函数。
你可以在这里测试这个例子:http://play.golang.org/p/oTmuNMz-0e
英文:
You can customise how a type is marshaled by implementing the json.Marshaler
interface. This overrides the default behaviour of introspecting the fields of structs.
For this particular example, you could do something like:
func (s MyStruct) MarshalJSON() ([]byte, error) {
data := map[string]interface{}{
key: s.field,
}
return json.Marshal(data)
}
Here I'm constructing a map[string]interface{}
value that represents what I want in the JSON output and passing it to json.Marshal
.
You can test out this example here: http://play.golang.org/p/oTmuNMz-0e
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论