长亭百川云 - 文章详情

Golang 结构体标签在 json 中的应用

RedTeam

46

2024-07-13

0x00 结构体标签的应用

  1. json 编解码

  2. ORM 映射关系

0x01 将 struct 转换为 json

``package main      import (    "encoding/json"    "fmt"   )      type Movie struct {    Title  string   `json:"title"`    Year   int      `json:"year"`    Price  int      `json:"rmb"`    Actors []string `json:"actors"`   }      func main() {    movie := Movie{"喜剧之王", 2000, 10, []string{"xingye", "zhangbozhi"}}       // 编码过程 struct -> json    jsonStr, err := json.Marshal(movie)    if err != nil {     fmt.Println("json marsha1 error ", err)    }       fmt.Printf("jsonStr = %s\n", jsonStr)   }      ``

image

0x02 将 json 转换为 struct

``package main      import (    "encoding/json"    "fmt"   )      type Movie struct {    Title  string   `json:"title"`    Year   int      `json:"year"`    Price  int      `json:"rmb"`    Actors []string `json:"actors"`   }      func main() {    movie := Movie{"喜剧之王", 2000, 10, []string{"xingye", "zhangbozhi"}}       // 编码过程 struct -> json    jsonStr, err := json.Marshal(movie)    if err != nil {     fmt.Println("json marsha1 error ", err)    }       fmt.Printf("jsonStr = %s\n", jsonStr)       // 解码过程 json -> struct    // jsonStr = {"title":"喜剧之王","year":2000,"rmb":10,"actors":["xingye","zhangbozhi"]}    myMovie := Movie{}    err = json.Unmarshal(jsonStr, &myMovie)    if err != nil {     fmt.Println("json unmarsha1 error ", err)     return    }    fmt.Printf("%v\n", myMovie)   }      ``

image

0x03 将 json 转换为 map[string]interface{}

map 是 Golang 中的字典类型,key 是 string 类型,interface{} 是 Golang 中的万能接口类型。

``package main      import (    "encoding/json"    "fmt"   )      type Movie struct {    Title  string   `json:"title"`    Year   int      `json:"year"`    Price  int      `json:"rmb"`    Actors []string `json:"actors"`   }      func main() {    movie := Movie{"喜剧之王", 2000, 10, []string{"xingye", "zhangbozhi"}}       // 编码过程 struct -> json    jsonStr, err := json.Marshal(movie)    if err != nil {     fmt.Println("json marsha1 error ", err)    }       fmt.Printf("jsonStr = %s\n", jsonStr)       // 解码过程 json -> struct    // jsonStr = {"title":"喜剧之王","year":2000,"rmb":10,"actors":["xingye","zhangbozhi"]}    myMovie := Movie{}    err = json.Unmarshal(jsonStr, &myMovie)    if err != nil {     fmt.Println("json unmarsha1 error ", err)     return    }    fmt.Printf("%v\n", myMovie)    fmt.Printf("jsonStr's type is: %T\n", jsonStr)       // 解码过程 json -> map[string]interface{}    var vul map[string]interface{}       vulJsonStr := `{     "urls": [       "https://snyk-patches.s3.amazonaws.com/npm/backbone/20110701/backbone_20110701_0_0_0cdc525961d3fa98e810ffae6bcc8e3838e36d93.patch"     ],     "version": "<0.5.0 >=0.3.3",     "modificationTime": "2015-11-06T02:09:36.180Z",     "comments": [       "https://github.com/jashkenas/backbone/commit/0cdc525961d3fa98e810ffae6bcc8e3838e36d93.patch"     ],     "id": "patch:npm:backbone:20110701:0"   }`       fmt.Printf("vulJsonStr's type is %T\n", vulJsonStr)       vulJsonByteSlice := []byte(vulJsonStr)       err = json.Unmarshal(vulJsonByteSlice, &vul)    if err != nil {     fmt.Println("json unmarshal error ", err)     return    }    fmt.Printf("%v\n", vul)    fmt.Println("vul version is: ", vul["version"])   }      ``

image

0x04 将 json 转换为万能类型 interface{}

interface{} 是 Golang 中的万能类型,当我们不知道 json 的具体格式时,或者 json 的格式是变化的时,我们可以将其转换为 interface{} 万能类型,此时我们可以看到 json 最后的格式为 map[string]interface{}。

``package main      import (    "encoding/json"    "fmt"   )      type Movie struct {    Title  string   `json:"title"`    Year   int      `json:"year"`    Price  int      `json:"rmb"`    Actors []string `json:"actors"`   }      func main() {    movie := Movie{"喜剧之王", 2000, 10, []string{"xingye", "zhangbozhi"}}       // 编码过程 struct -> json    jsonStr, err := json.Marshal(movie)    if err != nil {     fmt.Println("json marsha1 error ", err)    }       fmt.Printf("jsonStr = %s\n", jsonStr)       // 解码过程 json -> struct    // jsonStr = {"title":"喜剧之王","year":2000,"rmb":10,"actors":["xingye","zhangbozhi"]}    myMovie := Movie{}    err = json.Unmarshal(jsonStr, &myMovie)    if err != nil {     fmt.Println("json unmarsha1 error ", err)     return    }    fmt.Printf("%v\n", myMovie)    fmt.Printf("jsonStr's type is: %T\n", jsonStr)       // 解码过程 json -> map[string]interface{}    var vul map[string]interface{}       vulJsonStr := `{     "urls": [       "https://snyk-patches.s3.amazonaws.com/npm/backbone/20110701/backbone_20110701_0_0_0cdc525961d3fa98e810ffae6bcc8e3838e36d93.patch"     ],     "version": "<0.5.0 >=0.3.3",     "modificationTime": "2015-11-06T02:09:36.180Z",     "comments": [       "https://github.com/jashkenas/backbone/commit/0cdc525961d3fa98e810ffae6bcc8e3838e36d93.patch"     ],     "id": "patch:npm:backbone:20110701:0"   }`       fmt.Printf("vulJsonStr's type is %T\n", vulJsonStr)       vulJsonByteSlice := []byte(vulJsonStr)       err = json.Unmarshal(vulJsonByteSlice, &vul)    if err != nil {     fmt.Println("json unmarshal error ", err)     return    }    fmt.Printf("%v\n", vul)    fmt.Println("vul version is: ", vul["version"])    fmt.Printf("%T\n", vul)       fmt.Println("====================")       var vulIF interface{}    err = json.Unmarshal(vulJsonByteSlice, &vulIF)    if err != nil {     fmt.Println("json unmarshal error ", err)     return    }       fmt.Println(vulIF)    fmt.Printf("%T", vulIF)      }      ``

image

0x05 References

  1. https://www.bilibili.com/video/BV1gf4y1r79E?p=25

  2. [Go]当把json解析到interface{}时 , 对应的真正类型 https://www.cnblogs.com/taoshihan/p/12960449.html

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2