golang 解析 map[string]interface{} 和 json 到 struct

从 json 转成 strcut 可以算是go开发中的常事了。这里记录两个窍门。

通过 json 自动生成 struct 声明

一般来说如果只有三四个字段,还是比较轻松的,如果有50个以上的字段,光是定义结构体,都要累死一拨人了~

这时候这个网站 https://app.quicktype.io/ 真是个神器一般的存在,可以根据 json 定义go struct。

image-20201215165155521

猜测json的内部数据类型

进行开发,解析json数据时,我先写了以下的测试代码,用于判断数据的格式。不得不说,强类型的语言就是有这种不方便。

同时要注意下面几个事项:

  • 解析出来的 int 类型会变成 float64 类型
  • 要注意和前端的交互,某些情形下前端解析 int64 会有精度问题,如果涉及前端的交互,尽量避免使用int64,或先转成string再与前端交互。
func GuessType(k string, v interface{})  {
  switch value := v.(type) {
  case nil:
    fmt.Println(k, "is nil", "null")
  case string:
    fmt.Println(k, "is string", value)
  case int:
    fmt.Println(k, "is int", value)
  case float64:
    fmt.Println(k, "is float64", value)
  case []interface{}:
    fmt.Println(k, "is an array:")
    for i, u := range value {
      fmt.Println(i, u)
    }
  case map[string]interface{}:
    fmt.Println(k, "is an map:")
  default:
    fmt.Println(k, "is unknown type", fmt.Sprintf("%T", v))
  }

}

func GuessTypeFromMapStringInterface(m map[string]interface{}){
  for k, v := range m {
    GuessType(k,v)
  }
}

将 map[string]interface{} 和 json 转成struct

由上一个步骤接着往下走,使用 encoding/json 库中的格式化命令,先将 json 格式化,再反格式化成 struct:

import "encoding/json"

  tmpJson, err := json.Marshal(data)
  if err != nil {
    return nil, err
  }
  create := KeluTest{}
  json.Unmarshal(tmpJson, &create)

参考资料


golang mgo 库的简单使用备忘 golang jwt 解析过期信息