我有以下内容:
package main
import (
"encoding/json"
"fmt"
"os"
"reflect"
)
type User struct {
ID int64 `json:"id"`
Name string `json:"first"` // want to change this to `json:"name"`
tag string `json:"-"`
Another
}
type Another struct {
Address string `json:"address"`
}
func (u *User) MarshalJSON() ([]byte, error) {
value := reflect.ValueOf(*u)
for i := 0; i < value.NumField(); i++ {
tag := value.Type().Field(i).Tag.Get("json")
field := value.Field(i)
fmt.Println(tag, field)
}
return json.Marshal(u)
}
func main() {
anoth := Another{"123 Jennings Street"}
_ = json.NewEncoder(os.Stdout).Encode(
&User{1, "Ken Jennings", "name",
anoth},
)
}
我正在尝试对结构进行 json 编码,但在此之前我需要更改 json 键...例如最终的 json 应该如下所示:
{"id": 1, "name": "Ken Jennings", "address": "123 Jennings Street"}
我注意到 value.Type().Field(i).Tag.Get("json") 的方法,但是没有 setter 方法。为什么?以及如何获得所需的 json 输出。
另外,如何迭代所有字段,包括嵌入的结构 Another?
https://play.golang.org/p/Qi8Jq_4W0t https://play.golang.org/p/Qi8Jq_4W0t
从 Go 1.8 开始你可以使用这个解决方案:
func main() {
anoth := Another{"123 Jennings Street"}
_ = json.NewEncoder(os.Stdout).Encode(
&User{1, "Ken Jennings", "name",
anoth},
)
}
type User struct {
ID int64 `json:"id"`
Name string `json:"first"` // want to change this to `json:"name"`
tag string `json:"-"`
Another
}
type Another struct {
Address string `json:"address"`
}
func (u *User) MarshalJSON() ([]byte, error) {
type alias struct {
ID int64 `json:"id"`
Name string `json:"name"`
tag string `json:"-"`
Another
}
var a alias = alias(*u)
return json.Marshal(&a)
}
会给我们:
{"id":1,"name":"Ken Jennings","address":"123 Jennings Street"}
这个解决方案之所以成为可能,是因为在 Go 1.8 中,您可以为结构体分配相同的结构,但彼此分配不同的标签。如您所见,键入alias
具有与类型相同的字段User
但有不同的标签。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)