我有以下内容:
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输出.
另外,如何遍历所有字段,包括嵌入式结构另一个?
解决方法
它是kludgy,但是如果你可以将结构包装在另一个结构中,并使用新结构进行编码,那么你可以:
>编码原始结构,
>将其解码为接口{}以获取地图
>替换地图键
>然后编码地图并将其返回
从而:
type MyUser struct { U User } func (u MyUser) MarshalJSON() ([]byte,error) { // encode the original m,_ := json.Marshal(u.U) // decode it back to get a map var a interface{} json.Unmarshal(m,&a) b := a.(map[string]interface{}) // Replace the map key b["name"] = b["first"] delete(b,"first") // Return encoding of the map return json.Marshal(b) }