go – 如何动态更改struct的json标记?

前端之家收集整理的这篇文章主要介绍了go – 如何动态更改struct的json标记?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下内容
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输出.

另外,如何遍历所有字段,包括嵌入式结构另一个?

https://play.golang.org/p/Qi8Jq_4W0t

解决方法

它是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)
}

在操场上:https://play.golang.org/p/TabSga4i17

猜你在找的JavaScript相关文章