Go 系列教程 —— 33. golang中struct、json、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
24
25
26
27
28
29
30
package main
 
import (
     "encoding/json"
     "fmt"
)
 
type IT struct {
     Company string `json: "-" ` //此字段不會輸出到屏幕
     //Company  string   `json:"company"`       這樣打印輸出別名首字母就會小寫(二次編碼)
     Subjects []string `json: "subjects" ` //二次編碼
     IsOk     bool     `json: ",string" `
     Price    float64  `json: ",string" `
}
 
func main() {
     //定義一個結構體變量,同時初始化
     s := IT{ "itcast" , []string{ "Golang" , "PHP" , "Java" , "C++" }, true, 666.666}
 
     //編碼,根據內容生成json文本
     //buf, err := json.Marshal(s)
     //buf =  {"subjects":["Golang","PHP","Java","C++"],"IsOk":"true","Price":"666.666"}
     buf, err := json.MarshalIndent(s, "" , "    " ) //格式化編碼
     if err != nil {
         fmt.Println( "err = " , err)
         return
     }
 
     fmt.Println( "buf = " , string(buf))
}

  

?
1
2
3
4
5
6
7
8
9
10
11
//結果
buf =  {
         "subjects" : [   //首字母小寫
                "Golang" ,
                 "PHP" ,
                 "Java" ,
                 "C++"
         ],
        "IsOk" : "true" ,   //string類型
        "Price" : "666.666"
}

  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
package main
 
import (
     "encoding/json"
     "fmt"
)
 
type IT struct {
     Address   string   `json: "address" `
     Languages []string `json: "languages" ` //二次編碼
     Status    bool     `json: "isok" `
     Price     float64  `json: "price" `
}
 
func main() {
 
     jsonBuf := `
     {
     "address" : "北京" ,
     "languages" : [
         "Golang" ,
         "PHP" ,
         "Java" ,
         "Python"
     ],
     "status" : true,
     "price" : 666.666
}`
 
     var tmp IT                                   //定義一個結構體變量
     err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二個參數要地址傳遞
     if err != nil {
         fmt.Println( "err = " , err)
         return
     }
     //fmt.Println("tmp = ", tmp)
     fmt.Printf( "tmp = %+v\n" , tmp)
 
     type IT2 struct {
         Subjects []string `json: "languages" ` //二次編碼
     }
 
     var tmp2 IT2
     err = json.Unmarshal([]byte(jsonBuf), &tmp2) //第二個參數要地址傳遞
     if err != nil {
         fmt.Println( "err = " , err)
         return
     }
     fmt.Printf( "tmp2 = %+v\n" , tmp2)
 
}

  

?
1
2
tmp = {Address:北京 Languages:[Golang PHP Java Python] Status:false Price:666.666}
tmp2 = {Subjects:[Golang PHP Java Python]}

  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
24
25
package main
 
import (
     "encoding/json"
     "fmt"
)
 
func main() {
     //建立一個map
     m := make( map [string] interface {}, 4) //由於類型多,能夠用interface空接口
     m[ "address" ] = "北京"
     m[ "languages" ] = []string{ "Golang" , "PHP" , "Java" , "Python" }
     m[ "status" ] = true
     m[ "price" ] = 666.666
 
     //編碼成json
     //result, err := json.Marshal(m)
     //result =  {"address":"北京","languages":["Golang","PHP","Java","Python"],"price":666.666,"status":true}
     result, err := json.MarshalIndent(m, "" , "    " )
     if err != nil {
         fmt.Println( "err = " , err)
         return
     }
     fmt.Println( "result = " , string(result))
}

  

?
1
2
3
4
5
6
7
8
9
10
11
result =  {
         "address" : "北京" ,
         "languages" : [
                 "Golang" ,
                 "PHP" ,
                 "Java" ,
                 "Python"
         ],
         "price" : 666.666,
         "status" : true
}

  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
48
49
50
51
52
53
54
55
56
57
package main
 
import (
     "encoding/json"
     "fmt"
)
 
func main() {
     jsonBuf := `
     {
     "company" : "itcast" ,
     "subjects" : [
         "Go" ,
         "C++" ,
         "Python" ,
         "Test"
     ],
     "isok" : true,
     "price" : 666.666
}`
 
     //建立一個map
     m := make( map [string] interface {}, 4)
 
     err := json.Unmarshal([]byte(jsonBuf), &m) //第二個參數要地址傳遞
     if err != nil {
         fmt.Println( "err = " , err)
         return
     }
     fmt.Printf( "m = %+v\n" , m)
 
     //    var str string
     //    str = string(m["company"]) //err, 沒法轉換
     //    fmt.Println("str = ", str)
 
     var str string
 
     //類型斷言, 值,它是value類型
     for key, value := range m {
         //fmt.Printf("%v ============> %v\n", key, value)
         switch data := value.( type ) {
         case string:
             str = data
             fmt.Printf( "map[%s]的值類型爲string, value = %s\n" , key, str)
         case bool:
             fmt.Printf( "map[%s]的值類型爲bool, value = %v\n" , key, data)
         case float64:
             fmt.Printf( "map[%s]的值類型爲float64, value = %f\n" , key, data)
         case []string:
             fmt.Printf( "map[%s]的值類型爲[]string, value = %v\n" , key, data)
         case [] interface {}:
             fmt.Printf( "map[%s]的值類型爲[]interface, value = %v\n" , key, data)
         }
 
     }
 
}

  

?
1
2
3
4
map [address]的值類型爲string, value = 北京
map [Languages]的值類型爲[] interface , value = [Golang PHP Java Python]
map [Status]的值類型爲bool, value = true
map [price]的值類型爲float64, value = 666.666000

  []interface{}轉json

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
  
import (
     "encoding/json"
     "fmt"
)
func main(){
     var s [] interface {}
     s = append(s,5)
     s = append(s,[]string{ "Golang" , "PHP" , "Java" , "Python" })
     s = append(s, map [string]string{ "hello" : "world" })
     result, err := json.MarshalIndent(s, "" , "    " )
     if err != nil {
         fmt.Println( "err = " , err)
         return
     }
     fmt.Println( "result = " , string(result))
}

  

?
1
2
3
4
5
6
7
8
9
10
11
12
result =  [
     5,
     [
         "Golang" ,
         "PHP" ,
         "Java" ,
         "Python"
     ],
     {
         "hello" : "world"
     }
]
相關文章
相關標籤/搜索