golang json 處理的一些例子代碼


json 處理的例子代碼, 解析結果看后面注釋。

 

package main

import "encoding/json"
import "fmt"
import "os"

type Response1 struct {
    Page   int
    Fruits []string
}

type Response2 struct {
    Page   int      `json:"page"`
    Fruits []string `json:"fruits"`
}

type CommonArg struct {
    SessionId int64  `json:",string"`
    Op        string `json:"Op,omitempty"`
    AppId     string `json:"appId,omitempty"`
    Online    bool
}

func main() {
    bolB, _ := json.Marshal(true)
    fmt.Println(string(bolB)) // true

    intB, _ := json.Marshal(1)
    fmt.Println(string(intB)) // 1

    fltB, _ := json.Marshal(2.34)
    fmt.Println(string(fltB)) // 2.34

    strB, _ := json.Marshal("gopher")
    fmt.Println(string(strB)) // "gopher"

    slcD := []string{"apple", "peach", "pear"}
    slcB, _ := json.Marshal(slcD)
    fmt.Println(string(slcB)) //  ["apple","peach","pear"]

    mapD := map[string]int{"apple": 5, "lettuce": 7}
    mapB, _ := json.Marshal(mapD)
    fmt.Println(string(mapB)) // {"apple":5,"lettuce":7}

    res1D := &Response1{
        Page:   1,
        Fruits: []string{"apple", "peach", "pear"}}
    res1B, _ := json.Marshal(res1D)
    fmt.Println(string(res1B)) // {"Page":1,"Fruits":["apple","peach","pear"]}

    res2D := &Response2{
        Page:   1,
        Fruits: []string{"apple", "peach", "pear"}}
    res2B, _ := json.Marshal(res2D)
    fmt.Println(string(res2B)) // {"Page":1,"Fruits":["apple","peach","pear"]}

    aaa := &CommonArg{
        SessionId: 12345,
        Op:        "werdfsdde22233",
        AppId:     "654343dfddd33424dd",
        Online:    false,
    }
    aaa1, _ := json.Marshal(aaa)
    fmt.Println(string(aaa1)) // {"SessionId":"12345","Op":"werdfsdde22233","appId":"654343dfddd33424dd","Online":false}

    byt := []byte(`{"num":6.0,"strs":["a","b"]}`)

    var dat map[string]interface{}

    if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }
    fmt.Println(dat) // map[strs:[a b] num:6]

    num := dat["num"].(float64)
    fmt.Println(num) // 6

    strs := dat["strs"].([]interface{})
    str1 := strs[0].(string)
    fmt.Println(str1) // a

    str := `{"page": 1, "fruits": ["apple", "peach"]}`
    res := &Response2{}
    json.Unmarshal([]byte(str), &res)
    fmt.Println(res)           // &{1 [apple peach]}
    fmt.Println(res.Fruits[0]) // apple

    enc := json.NewEncoder(os.Stdout)
    d := map[string]int{"apple": 5, "lettuce": 7}
    enc.Encode(d) // {"apple":5,"lettuce":7}
}

 

注意,這里 json的 struct field's tag 規范定義如下:

在Go語言里,StructTag是一個標記字符串,此字符串可跟隨在Struct中字段定義的后面。

StructTag就是一系列的 key:”value” 形式的組合,其中key是一個不可為空的字符串,key-value組合可以有多個,空格分隔。

StructTag有什么用?!StructTag主要解決了不同類型數據集合間(Struct,Json,Table等)轉換中鍵值Key定義不一樣的問題。StructTag可以理解為一個不同數據類型鍵值Key的映射表Map, 在StructTag中可以定義不同數據集合鍵值和Struct中Key值的映射關系,這樣方便了Struct數據轉為其他類型數據的過程。

在StructTag中加入”omitempty”, 標識該字段的數據可忽略。

- 指定到一個field時,無論有沒有值將Person序列化成json時都會忽略該字段

參考下面代碼, 代碼來自:http://studygolang.com/articles/1698

 

package main

import (
    "encoding/json"
    "fmt"
)

//tag中的第一個參數是用來指定別名
//比如Name 指定別名為 username `json:"username"`
//如果不想指定別名但是想指定其他參數用逗號來分隔
//omitempty 指定到一個field時 如果在賦值時對該屬性賦值 或者 對該屬性賦值為 zero value
//那么將Person序列化成json時會忽略該字段
//- 指定到一個field時
//無論有沒有值將Person序列化成json時都會忽略該字段
//string 指定到一個field時
//比如Person中的Count為int類型 如果沒有任何指定在序列化
//到json之后也是int 比如這個樣子 "Count":0
//但是如果指定了string之后序列化之后也是string類型的
//那么就是這個樣子"Count":"0"
type Person struct {
    Name        string `json:"username"`
    Age         int
    Gender      bool `json:",omitempty"`
    Profile     string
    OmitContent string `json:"-"`
    Count       int    `json:",string"`
}

func main() {

    var p *Person = &Person{
        Name:        "brainwu",
        Age:         21,
        Gender:      true,
        Profile:     "I am ghj1976",
        OmitContent: "OmitConent",
    }
    if bs, err := json.Marshal(&p); err != nil {
        panic(err)
    } else {
        //result --> {"username":"brainwu","Age":21,"Gender":true,"Profile":"I am ghj1976","Count":"0"}
        fmt.Println(string(bs))
    }

    var p2 *Person = &Person{
        Name:        "brainwu",
        Age:         21,
        Profile:     "I am ghj1976",
        OmitContent: "OmitConent",
    }
    if bs, err := json.Marshal(&p2); err != nil {
        panic(err)
    } else {
        //result --> {"username":"brainwu","Age":21,"Profile":"I am ghj1976","Count":"0"}
        fmt.Println(string(bs))
    }

    // slice 序列化為json
    var aStr []string = []string{"Go", "Java", "Python", "Android"}
    if bs, err := json.Marshal(aStr); err != nil {
        panic(err)
    } else {
        //result --> ["Go","Java","Python","Android"]
        fmt.Println(string(bs))
    }

    //map 序列化為json
    var m map[string]string = make(map[string]string)
    m["Go"] = "No.1"
    m["Java"] = "No.2"
    m["C"] = "No.3"
    if bs, err := json.Marshal(m); err != nil {
        panic(err)
    } else {
        //result --> {"C":"No.3","Go":"No.1","Java":"No.2"}
        fmt.Println(string(bs))
    }
}

 

參考:

GO語言中的StructTag類型
http://www.wangwei.info/2013/11/golang-struct-tag/


免責聲明!

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



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