Json 編碼 1:

package main

import (
       "fmt"
       "encoding/json"
)

func main() {
       m := User{"乃木坂春香", "abcde@yahoo.com", "0932-111-222", "Japan"}
       b, _ := json.Marshal(m)
       fmt.Println(string(b))
}

type User struct {
       Name string
       EMail string
       Phone string
       Address string
}


輸出結果:{"Name":"乃木坂春香","EMail":"abcde@yahoo.com","Phone":"0932-111-222","Address":"Japan"}


Json 編碼 2:

package main

import (
       "encoding/json"
       "fmt"
)

type UserData struct {
       Name string
       EMail string
}

type UserDataArray struct {
       User []UserData
}

func main() {
       var s UserDataArray

       s.User = append(s.User, UserData{Name: "夏娜碳", EMail: "shanatan@gmail.com"})
       s.User = append(s.User, UserData{Name: "多拉A夢", EMail: "dolaamo@yahoo.com"})
       b, err := json.Marshal(s)
       if err != nil {
              fmt.Println("json err:", err)
       }
        fmt.Println(string(b))
}


輸出結果 (其實輸出只有一行,這裡為了美觀我進行手工排版):

{
       "User":
       [
              {
                     "Name":"夏娜碳",
                     "EMail":"shanatan@gmail.com"

              },
              {
                     "Name":"多拉A夢",
                     "EMail":"dolaamo@yahoo.com"
              }
       ]
}


Json 編碼 3:

package main

import (
       "fmt"
       "encoding/json"
)

func main() {

       m := map[string]interface{}{
              "Name": "小鳩",
              "Age": 12,
              "Doll": []interface{}{
                     "Cat",
                     "Bear",
                     "Rabbit",
              },
       }

       b, _ := json.Marshal(m)
       fmt.Println(string(b))
}


輸出結果:{"Age":12,"Doll":["Cat","Bear","Rabbit"],"Name":"小鳩"}




Json 解碼 1:

package main

import (
       "fmt"
       "encoding/json"
)

type user struct {
       Name string
       Age int
       Married bool
}

func main() {
       src_json := []byte(`{"Name":"柏崎星奈","Age":16,"Married":false}`)
       u := user{}
       err := json.Unmarshal(src_json, &u)
       if err != nil {
              panic(err)
       }
       fmt.Println("Name: ", u.Name)
       fmt.Println("Age: ", u.Age)
       fmt.Println("Married: ", u.Married)
}


輸出結果:

       Name: 柏崎星奈
       Age: 16
       Married: false


Json 解碼 2:

package main

import (
       "encoding/json"
       "fmt"
)

func main() {
       src_json := []byte(`{"Name":"柏崎星奈","Age":16,"Married":false}`)
       // interface 可以接收任何類型的值
       u := map[string]interface{}{}
       err := json.Unmarshal(src_json, &u)
       if err != nil {
              panic(err)
       }
       fmt.Println("Name: ", u["Name"])
       fmt.Println("Age: ", u["Age"])
       // interface 也可以直接轉成你要的型別
       fmt.Printf("Married: %v", u["Married"].(bool))
}


輸出結果:

       Name: 柏崎星奈
       Age: 16
       Married: false


Json 解碼 3 (終極版): 

package main

import (
       "encoding/json"
       "fmt"
)

const myJson = `{
       "Name":"刀劍神域",
       "Type":"小說",
       "Author":"川原礫",
       "IllustrationAuthor":"abec",
       "Publishing":"ASCII Media Works",
       "ProductCounts":{
              "NovelCounts":12,
              "CartoonCounts":2,
              "AnimationCount":25
       },
       "Staff":[
              {
                     "Name":"多拉A夢",
                     "Phone":"0944-444-444",
                     "EMail":"DoLaLa@gmail.com",
                     "Address":"Japan"
              },
              {
                     "Name":"天線寶寶(丁丁)",
                     "Phone":"0954-788-438",
                     "Email":"a54385478@yahoo.com.tw",
                     "Address":"Earth"
              }
       ]
}`

type ProductCountsInfo struct {
       NovelCounts        int
       CartoonCounts    int
       AnimationCount   int
}

type StaffInfo struct {
       Name         string
       Phone        string
       Email          string
       Address     string
}

type ThemeInfo struct {
       Name                     string
       Type                       string
       Author                    string
       IllustrationAuthor   string
       Publishing              string
       ProductCounts       ProductCountsInfo
       Staff                       []StaffInfo
}

func main() {

       var t ThemeInfo
       json.Unmarshal([]byte(myJson), &t)
       fmt.Println("重構後:", t, "\n")
       fmt.Println("名稱:", t.Name)
       fmt.Println("類型:", t.Type)
       fmt.Println("作者:", t.Author)
       fmt.Println("插畫家:", t.IllustrationAuthor)
       fmt.Println("出版社:", t.Publishing)

       fmt.Println("\n產品數量:")

       fmt.Println(" 小說數量:", t.ProductCounts.NovelCounts)
       fmt.Println(" 漫畫數量:", t.ProductCounts.CartoonCounts)
       fmt.Println(" 動畫數量", t.ProductCounts.AnimationCount)

       fmt.Println("\n工作人員:")
       fmt.Println(" 0:")

       fmt.Println(" 姓名:", t.Staff[0].Name)
       fmt.Println(" 手機:", t.Staff[0].Phone)
       fmt.Println(" 電子信箱:", t.Staff[0].Email)
       fmt.Println(" 住址:", t.Staff[0].Address)

       fmt.Println(" 1:")

       fmt.Println(" 姓名:", t.Staff[1].Name)
       fmt.Println(" 手機:", t.Staff[1].Phone)
       fmt.Println(" 電子信箱:", t.Staff[1].Email)
       fmt.Println(" 住址:", t.Staff[1].Address)
}

 


輸出結果:

重構後: {刀劍神域 小說 川原礫 abec ASCII Media Works {12 2 25} [{多拉A夢 0944-444-444 DoLaLa@gmail.com Japan} {天線寶寶(丁丁) 0954-788-438 a54385478@yahoo.com.tw Earth}]}

名稱: 刀劍神域
類型: 小說
作者: 川原礫
插畫家: abec
出版社: ASCII Media Works

產品數量:
        小說數量: 12
        漫畫數量: 2
        動畫數量 25

工作人員:
        0:
          姓名: 多拉A夢
          手機: 0944-444-444
          電子信箱: DoLaLa@gmail.com
          住址: Japan
       1:
          姓名: 天線寶寶(丁丁)
          手機: 0954-788-438
          電子信箱: a54385478@yahoo.com.tw
          住址: Earth


Json 解碼 4 (解未知結構):

package main

import (
       "encoding/json"
       "fmt"
)

func main() {
       b := []byte(`{
              "Name":"天羽美羽",
              "Dolls":["Rabbit","Cat","Bear","Dog"],
              "EMail":"aaa1111@yahoo.com",
              "Age":17,
              "Price":9.99,
              "Sales":10000000
       }`)

       var r interface{}

       json.Unmarshal(b, &r)

       loli, ok := r.(map[string]interface{})

       if ok {
              for k, v := range loli {
                     switch v2 := v.(type) {
                            case string:
                                   fmt.Println("Key:", k, ",Value:", v2, ",型別是 string")
                            case int:
                                   fmt.Println("Key:", k, ",Value:", v2, ",型別是 int")
                            case float64:
                                   fmt.Println("Key:", k, ",Value:", v2, ",型別是 float64")
                            case bool:
                                   fmt.Println("Key:", k, ",Value:", v2, ",型別是 bool")
                            case []interface{}:
                                   fmt.Println(k, "是 陣列:", v2)
                                   for i, iv := range v2 {
                                          fmt.Println(i, ":", iv)
                                   }
                            default:
                                   fmt.Println(k, " 是其他型別...")
                     }
              }
       }
}


輸出結果:

Key: Sales ,Value: 1e+07 ,型別是 float64
Dolls 是 陣列: [Rabbit Cat Bear Dog]
0 : Rabbit
1 : Cat
2 : Bear
3 : Dog
Key: Age ,Value: 17 ,型別是 float64
Key: Name ,Value: 天羽美羽 ,型別是 string
Key: Price ,Value: 9.99 ,型別是 float64
Key: EMail ,Value: aaa1111@yahoo.com ,型別是 string


 

 

 

 

 

 

 

創作者介紹
創作者 黃彥霖 的頭像
黃彥霖

彥霖 實驗筆記

黃彥霖 發表在 痞客邦 留言(0) 人氣()