你能通过json密钥字段动态地遍历Go中的struct字段吗?

时间:2018-05-25 01:52:05

标签: go

type Params struct {            
  MyNum    string `json:"req_num"`
}

所以我需要将MyNum的值分配给给定“req_num”字符串键的另一个变量,以便我在beego框架中编写一些功能。这可能在Go中,如果是这样的话?

我看了一下反射库,找不到办法。

这是我想要做的一个例子。 params是Params类型的变量,MyNum的值初始化为“123”让我们说。 f目前没有“123”。当我将其记录到控制台时,它会显示“”

b := "req_num"
r := reflect.ValueOf(params)
f := reflect.Indirect(r).FieldByName(b)

编辑:我将为多个参数执行此操作(上面我将b设置为示例字段值“req_num”)并且我想编写它以便我不必知道存储在b中的字段的名称。

2 个答案:

答案 0 :(得分:1)

遍历类型中的字段,查找具有给定JSON标记名称的字段。该值位于值的相应字段中。

name := "req_num"
v := reflect.ValueOf(Params{MyNum: "Hello"})
t := v.Type()
for i := 0; i < t.NumField(); i++ {
    if strings.Split(t.Field(i).Tag.Get("json"), ",")[0] == name {
        fmt.Printf("the value is %q\n", v.Field(i).Interface().(string))
    }
}

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

答案 1 :(得分:1)

使用JSON编解码器完成工作:

p, _ := json.Marshal(Params{MyNum: "123"}) // encode to JSON
var m map[string]interface{}
json.Unmarshal(p, &m)                      // decode to map
fmt.Println(m["req_num"])                  // get value from the map

Runnable example in the Go Playground

您可以避免将pipingencoder分配到内存中的整个JSON文档到decoder

value := Params{MyNum: "123"}
r, w := io.Pipe()
go func() {
    json.NewEncoder(w).Encode(value)
    w.Close()
}()
var m map[string]interface{}
json.NewDecoder(r).Decode(&m)
fmt.Println(m["req_num"])

Runnable example in the Go Playground