Go 結構體和map等數據結構轉json字符串


文章轉載自https://www.cnblogs.com/blog411032/p/10680355.html

 

 

Go語言中使用json包中的 Marshal() 函數將數據結構轉成json字符串,源代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func  Marshal(v  interface {}) ([]byte, error) {
     e := newEncodeState()
 
     err := e.marshal(v, encOpts{escapeHTML: true})
     if  err != nil {
         return  nil, err
     }
     buf := append([]byte(nil), e.Bytes()...)
 
     e.Reset()
     encodeStatePool.Put(e)
 
     return  buf, nil
}

  該函數接收一個參數 接口形式的參數(如果參數定義成接口類型)則可以接收任何參數。有兩個返回值:字符切片、錯誤。

結構體轉json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package  main
 
import  (
     "encoding/json"
     "fmt"
)
 
//創建結構體
type  Student  struct  {
     Id int
     Name string
     Address []string
     IsWork bool
}
 
//封裝返回結構體實例的方法
func  (s *Student) setStudentInfo(id int,name string,address []string, iswork bool) {
 
     s.Address = address
     s.Id = id
     s.IsWork = iswork
     s.Name = name
}
 
//封裝返回結構體實例的方法  返回結構體的指針
func  getStudentInfo(id int,name string,address []string, iswork bool) *Student {
     return  &Student{id,name,address,iswork}
}
 
 
func  main() {
     var  s Student
     //初始化結構體
     s.setStudentInfo(12, "jack" ,[]string{ "sh" , "bj" },false)
     //將結構體轉成json
     result , err := json.Marshal(s)
     if  err != nil {
         fmt.Println( "error" )
     }
 
     fmt.Printf( "result = %+v\n" ,string(result))
 
     stu := getStudentInfo(13, "tom" ,[]string{ "北京" , "上海" , "深圳" },true)
     fmt.Printf( "type is %T\n" ,stu)
 
     fmt.Printf( "student = %+v\n" ,stu)
     //獲取結構體的name屬性 本來是指針,但是可以直接獲取其屬性,這是go語言的語法糖
     fmt.Println( "stu.Name = " ,stu.Name)
     fmt.Println( "(*stu).Name = " ,(*stu).Name)
 
     result2,err2 := json.Marshal(stu)
     if  err2 != nil {
         fmt.Println( "error" )
     }
 
     fmt.Println(string(result2))
 
}

  

map轉json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package  main
 
import  (
     "encoding/json"
     "fmt"
)
 
func  main() {
 
     m := make( map [string] interface {})
 
     m[ "name" ] =  "jack"
     m[ "address" ] = []string{ "北京" , "河南" }
     m[ "iswork" ] = false
     m[ "age" ] = 18
 
     result,err := json.Marshal(m)
     if  err !=nil {
         fmt.Println( "error" )
     }
 
     fmt.Println(string(result))
}

  

json轉結構體:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package  main
 
import  (
     "encoding/json"
     "fmt"
)
 
/**
json轉結構體
  */
func  main() {
     //json串  內包含 一個切片  一個 int類型的age  一個bool類型的iswork 和一個 字符串類型的name
     jsonStr := `{ "Address" :[ "北京" , "河南" ], "Age" :18, "Iswork" :false, "Name" : "jack" }`
 
     var  p Person
 
     json.Unmarshal([]byte(jsonStr),&p)
 
     fmt.Printf( " p = %+v\n" ,p)
 
}
 
//定義結構體
//結構體的名字首字母一定要大寫,不然解析不出來
type  Person  struct  {
     Name string
     Age int
     Iswork bool
     Address []string
}

  

json轉map:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package  main
 
import  (
     "encoding/json"
     "fmt"
)
 
func  main() {
     //json串  內包含 一個切片  一個 int類型的age  一個bool類型的iswork 和一個 字符串類型的name
     jsonStr := `{ "Address" :[ "北京" , "河南" ], "Age" :18, "Iswork" :false, "Name" : "jack" }`
 
     m := make( map [string] interface {})
 
     json.Unmarshal([]byte(jsonStr),&m)
 
     //fmt.Println(m)
     //fmt.Printf("m = %+v\n",m)
 
     for  key,value :=  range  m{
         //fmt.Printf("m[%s] = %+v\n",key,value)
 
         //if key == "Address" {
         //  fmt.Printf("%T\n",value)//得出類型為接口類型 []interface {}   原本為 切片類型
         //}
 
         //通過斷言 推出數據的類型
         switch  data := value.( type ) {
         case  string:
             fmt.Printf( "m[%s] = %s\n" ,key,data)
         case  float64:
             fmt.Printf( "m[%s] = %f\n" ,key,data)
         case  bool:
             fmt.Printf( "m[%s] = %v\n" ,key,data)
         case  []string:
             fmt.Println( "是字符串切片類型" )
         case  [] interface {}:
             fmt.Printf( "是接口切片類型: %s =====> %v\n" ,key,data)
             fmt.Println( "======開始遍歷切片======" )
             for  index,v :=  range  data{
                 fmt.Printf( "%s[%d] = %s\n" ,key,index,v)
             }
             fmt.Println( "======遍歷切片結束======" )
         }
 
     }
 
}

  

如果不通過斷言去判斷類型,如果需要遍歷json串內切片的數據就沒辦法操作了。


免責聲明!

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



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