struct,map,json 互相轉換


1.1 struct to json 准備

  很簡單,使用encoding包可以互相轉換,沒什么好說的,但是有幾點注意:

1.結構體內需要序列化的字段首字母大寫(遵循駝峰式命名),不需要序列化的字段小寫無所謂了

Username string `json:"username"` 將會使用username做json key值

2.如果需要序列化后的json key格式小寫,需要加上json標簽 

`json:"password"`

3.json標簽內,首字符如果是逗號,將使用字段輸出,json標簽內的指定key將自動忽略

 `json:",password"`  加上逗號

4.如果需要忽略json輸出,可以在json標簽內,使用 '-',橫線作忽略標記

 `json:"-"` 作忽略

1.2結構體轉json

func structToJson() { user := User{5, "李長全", "1234"} result, _ := json.Marshal(user) fmt.Println(string(result)) }
結果展示

這種方式輸出的json,是一行展示,一般測試的時候,我會這樣輸出,方便做字符串比較,但是如果調試的時候,我習慣換一種方式,輸出的是json格式化之后的字符串,這樣就不用json工具做轉換了

func structToJson() { user := User{5, "李長全", "1234"} result, _ := json.MarshalIndent(user, "", "    ") fmt.Println(string(result)) }

結果展示

1.3 struct to json

func structToJson() { user := User{5, "李長全", "1234"} result, _ := json.MarshalIndent(user, "", "    ") u := &User{} json.Unmarshal(result, u) fmt.Printf("%+v\n", u) }

2.1struct轉map

 

func Struct2Map(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj)  //使用反射,k根據typeof拿到field
    v := reflect.ValueOf(obj) //v根據valueof拿到interface

    var data = make(map[string]interface{}) for i := 0; i < t.NumField(); i++ { data[t.Field(i).Name] = v.Field(i).Interface() } return data }

 通過反射,拿到屬性和值,屬性做key,值做value,存儲到map中,使用typeOf和valueOf,但是我當然是不喜歡了,我喜歡下面這種方式,使用valueOf就可以解決的問題,為啥非要多一步typeof

關於typeOf和valueOf,等我寫反射的時候,再詳細說

2.2反射第二種方式

func structToMap() { a := User{1, "李長全", "1234"} elem := reflect.ValueOf(&a).Elem() types := elem.Type() m := map[string]interface{}{} for i := 0; i < types.NumField(); i++ { m[types.Field(i).Name] = elem.Field(i).Interface() } }

當然了,方法還有,結構轉json,都會了,map轉json也是一樣的,那很簡單了,通過json做中間轉換一下啊, (a=b知道了,  b=c知道了  如何求ac,通過b轉換啊)

2.3通過json轉換

func structToEndMap() { t := time.Now() m := make(map[string]interface{}) user := User{5, "李長全", "1234"} j, _ := json.Marshal(user) json.Unmarshal(j, &m) fmt.Println(m) fmt.Printf("duration:%d", time.Now().Sub(t)) }

3.map轉結構


  map轉結構,我看到一種寫法使用第三方包,這個包叫mapstruct,只有decode方法,找半天,沒找到encode,這么low么,我是不信的,只能map轉成結構,結構無法回轉嗎,我是拒絕的

func MapToStruct() { mapInstance := make(map[string]interface{}) mapInstance["name"] = "lcq" mapInstance["age"] = 28

    var person User if err := mapstructure.Decode(mapInstance, &person); err != nil { fmt.Println(err) } fmt.Printf("struct:%v", person) }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM