package main

import (
    "encoding/json"
    "fmt"
)

//父物件
type Human struct {
    Name   string  `json:"english_name"` //把struct編碼成json字串時,Name欄位的key是english_name,而不是Name
    Age    int     `json:"-"`            //把struct編碼成json字串時,會忽略Age這個欄位
    Weight float64 //`json:",string"` //編碼成字串,這個string選項只適用字串,浮點型和整型資料
}

//子物件
type Student struct {
    Human
    Speciality string
    Hobby      []string
    Score      float64 `json:"total,omitempty"` //如果這個欄位是空值,則不編碼到JSON裡面,否則用total為名字編碼
    Secret     []byte  `json:",omitempty"`      //如果這個欄位是空值,則不編碼到JSON裡面,否則用Secret為名字編碼
    //是一個經過base64編碼的字串
}

func main() {
    json1Str := `[
    {"Name": "James", "Age": 22,"Weight":65.80},
    {"english_name": "Jack", "Age": 27,"Weight":78.50},
    {"Name": "Kite", "Age": 19,"Weight":61.40}]`
    //定義一個切片物件
    var humans []Human
    //json字串轉換成物件格式
    err1 := json.Unmarshal([]byte(json1Str), &humans)
    if err1 != nil {
        fmt.Println(err1)
    }
    fmt.Println("json字串轉換成物件格式")
    fmt.Println(humans)

    fmt.Println("物件集合轉換成json字串")
    //切片初始化3個物件
    slice1 := []Human{
        Human{Name: "James", Age: 22, Weight: 65.80},
        Human{Name: "Jack", Age: 27, Weight: 78.50},
        Human{Name: "Kite", Age: 19, Weight: 61.40}}
    //物件集合轉換成json字串
    data1, err2 := json.Marshal(slice1)
    if err2 != nil {
        fmt.Println(err2)
    }
    fmt.Println(string(data1))
    fmt.Println("=======================================================================================")

    stus := make([]Student, 0)
    jason := Student{
        Human: Human{
            Name:   "jason",
            Age:    28,
            Weight: 60.30},
        Speciality: "computer science",
        Hobby:      []string{"tennis", "swimming", "reading"},
        Score:      725.5,
        Secret:     []byte{'I', 20, 'L', 'o', 'v', 'e', 20, 'Y', 'o', 'u', '!'}}
    stus = append(stus, jason)
    fmt.Println(stus, "\n\r")
    //物件集合轉換成json字串
    data2, err3 := json.Marshal(stus[0])
    if err3 != nil {
        fmt.Println(err3)
    }
    fmt.Println(string(data2))

    fmt.Println("=======================================================================================")
    json2Str := `[
    {"english_name":"jason","Weight":60.3,"Speciality":"computer science","Hobby":["tennis","swimming","reading"],"total":725.5,"Secret":"SRRMb3ZlFFlvdSE="}]`
    //定義一個切片物件
    var stuss []Student
    //json字串轉換成物件格式
    err4 := json.Unmarshal([]byte(json2Str), &stuss)
    if err4 != nil {
        fmt.Println(err4)
    }
    fmt.Println("json字串轉換成物件格式")
    fmt.Println(stuss)

}

範例 如何獲得一個這樣的json格式的資料{"code":200,"msg":"ok","data":{"content":"test"}}

package main

import (
    "encoding/json"
    "fmt"
)

type Header struct {
    Code int    `json:"code"`
    Msg  string `json:"msg"`
    Data `json:"data"`
}

type Data struct {
    Content string `json:"content"`
}

func main() {
    in := Header{Code: 200, Msg: "ok", Data: Data{Content: "test"}}
    out, _ := json.Marshal(&in)
    json := string(out)
    fmt.Println(json)
}

{"asks":[[1671.7000,24.4247],[1671.8000,1.2068],[1672.0000,2.0000]]} 請問這樣的Json,對應的資料結構要怎麼定義?

使用Map實現獲得同樣的結果實現:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    data := make(map[string][][]float64)
    // data["asks"] = [][]float64{[]float64{1671.7000, 24.4247}, []float64{1671.8000, 1.2068}, []float64{1672.0000, 2.0000}}
    data["asks"] = [][]float64{{1671.7000, 24.4247}, {1671.8000, 1.2068}, {1672.0000, 2.0000}} // 簡寫格式
    out, _ := json.Marshal(data)
    json := string(out)
    fmt.Println(json)
}

除錯控制檯列印輸出如下資訊:

2017/07/10 11:27:44 server.go:73: Using API v1
2017/07/10 11:27:44 debugger.go:97: launching process with args: [/root/code/go/src/contoso.org/Gooo/debug www.baidu.com www.ifeng.com www.sina.com.cn www.qq.com www.taobao.com www.suning.com www.163.com www.iqiyi.com sports.cntv.cn www.jd.com]
API server listening at: 127.0.0.1:2345
2017/07/10 11:27:45 debugger.go:505: continuing
{"asks":[[1671.7,24.4247],[1671.8,1.2068],[1672,2]]}

.