[go-每日一库] golang中借助json等库实现struct和map互转

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

1.struct -> map

1.1 version-1

指定struct中tag-map
  1. // version-1, struct -> map
  2. type User struct {
  3.         Name string `map:"name,omitempty"`
  4.         Age int `map:"age,omitempty"`
  5.         Profile UserProfile `map:"profile,dive"` // struct dive
  6.         NoDive StructDive `map:"no_dive, omitempty"` // no dive
  7. }
  8. type UserProfile struct {
  9.         Address string `map:"address"`
  10.         City string `map:"city"`
  11.         Job string `map:"job"`
  12. }
  13. type StructDive struct {
  14.         NoDive int
  15. }
  16. func newUser() User {
  17.         name := "spiderMan"
  18.         age := 12
  19.         profile := UserProfile{
  20.                 Address: "Jiaozi Road",
  21.                 City: "chengdu",
  22.                 Job: "Backend Engineer",
  23.         }
  24.         nodive := StructDive{20}
  25.         return User{
  26.                 Name: name,
  27.                 Age: age,
  28.                 Profile: profile,
  29.                 NoDive: nodive,
  30.         }
  31. }
  32. func struct2map(v interface{}) map[string]interface{} {
  33.         data, _ := json.Marshal(v)
  34.         m := make(map[string]interface{})
  35.         _ = json.Unmarshal(data, &m)
  36.         return m
  37. }
复制代码
1.2 version-2

不指定struct直接转map
  1. // version-2 struct -> map
  2. type User2 struct {
  3.         Name string `json:"name"`
  4.         Profile UserProfile `json:"profile"`
  5. }
  6. type UserProfile2 struct {
  7.         Address string `json:"address"`
  8.         City string `json:"city"`
  9.         Job string `json:"job"`
  10. }
  11. func newUser2() User2 {
  12.         return User2{
  13.                 Name: "superMan",
  14.                 Profile: UserProfile{
  15.                         Address: "Tiananmen",
  16.                         City: "beijing",
  17.                         Job: "HR",
  18.                 },
  19.         }
  20. }
复制代码
2.map -> struct
  1. func newMap() map[string]interface{} {
  2.         m := make(map[string]interface{})
  3.         m["name"] = "super-man"
  4.         m["profile"] = map[string]interface{}{
  5.                 "address": "Tiananmen",
  6.                 "city": "beijing",
  7.                 "job": "HR",
  8.         }
  9.         return m
  10. }
  11. // map -> struct, dst should be ptr
  12. func map2Struct(m map[string]interface{}, dst interface{})  {
  13.         data, err := json.Marshal(m)
  14.         if err != nil {
  15.                 fmt.Println(err)
  16.         }
  17.         _ = json.Unmarshal(data, &dst)
  18. }
复制代码
以下是测试情况:
  1. func main()  {
  2.         // 1.struct -> map
  3.         // version-1
  4.         user := newUser()
  5.         m := struct2map(user)
  6.         for k,v := range m {
  7.                 fmt.Printf("key: %s, val: %v\n", k, v)
  8.                 switch reflect.TypeOf(v).Kind() {
  9.                 case reflect.Map:
  10.                         for k2, v2 := range v.(map[string]interface{}) {
  11.                                 fmt.Printf("key-2: %s, val-2: %v\n", k2, v2)
  12.                         }
  13.                 }
  14.         }
  15.         /*
  16.         key: Age, val: 12
  17.         key: Profile, val: map[Address:Jiaozi Road City:chengdu Job:Backend Engineer]
  18.         key-2: Address, val-2: Jiaozi Road
  19.         key-2: City, val-2: chengdu
  20.         key-2: Job, val-2: Backend Engineer
  21.         key: NoDive, val: map[NoDive:20]
  22.         key-2: NoDive, val-2: 20
  23.         key: Name, val: spiderMan
  24.          */
  25.         // version-2
  26.         fmt.Println("\nit's version-2 struct to map")
  27.         user2 := newUser2()
  28.         m2 := struct2map(user2)
  29.         for k,v := range m2 {
  30.                 fmt.Printf("key: %s, val: %v\n", k, v)
  31.                 switch reflect.TypeOf(v).Kind() {
  32.                 case reflect.Map:
  33.                         for k2, v2 := range v.(map[string]interface{}) {
  34.                                 fmt.Printf("key-2: %s, val-2: %v\n", k2, v2)
  35.                         }
  36.                 }
  37.         }
  38.         /*
  39.         key: name, val: superMan
  40.         key: profile, val: map[Address:Tiananmen City:beijing Job:HR]
  41.         key-2: Job, val-2: HR
  42.         key-2: Address, val-2: Tiananmen
  43.         key-2: City, val-2: beijing
  44.          */
  45.         // 2.map -> struct
  46.         fmt.Println("\nmap -> json")
  47.         m3 := newMap()
  48.         var user3 User2
  49.         map2Struct(m3, &user3)
  50.         fmt.Println(user3)
  51.         /*
  52.         {super-man {Tiananmen beijing HR}}
  53.          */
  54. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表