Go聖經-學習筆記之複合類型(三)

上一篇 Go聖經-學習筆記之複合類型(二)前端

下一篇 Go聖經-學習筆記之函數和錯誤處理git

json數據的序列化和反序列化

json的全稱是Javascript object notation, 中文全稱:js對象表示法。在序列化和反序列化的協議中,有:json、xml、yaml、protocol buffer等。其中json是先後端API契約數據的主要傳輸形式。json支持數值、布爾值、數組和對象四種數據類型。經過這四種數據類型,能夠構建複雜的數據模型。github

在Go語言中,經過json標準庫,能夠進行數據的序列化和反序列化。它能夠序列化map,結構體、數組和slice動態數組、內置的基本數據類型。golang

咱們在這裏舉三個例子,說明json的使用方法,初學者可能常常只用到一種結構體對象接收和發送數據。json

結構體

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    var (
        newPer Person
        bts []byte
    )
    per:=Person{
        Name: "Lily",
        Age:  29,
    }
    // 序列化
    if bts, err = json.Marshal(per); err !=nil{
        log.Fatal(err.Error())
        return
    }
    
    if err = json.Unmarshal(bts, &newPer); err !=nil{
        log.Fatal(err.Error())
        return
    }
    fmt.Println(newPer)
}

map

func main() {
    var (
        smap =  map[string]int{
            "Age": 28,
            "Sex": 1,
            "Floor": 12,
        }
        newSmap = make(map[string]int)
        bts []byte
    )
    if bts, err = json.Marshal(smap); err !=nil {
        log.Fatal(err.Error())
        return
    }
    if err = json.Umarshal(bts, &newSmap); err !=nil {
        log.Fatal(err.Error())
        return
    }
    fmt.Println(newSmap)
}

數組或者slice動態數組

func main() {
    var (
        ages    []int = []int{23, 20, 28, 25, 30}
        bts     []byte
        err     error
        newAges = make([]int, len(ages))
    )
    if bts, err = json.Marshal(ages); err != nil {
        fmt.Println(err.Error())
        return
    }
    if err = json.Unmarshal(bts, &newAges); err != nil {
        fmt.Println(err.Error())
        return
    }
    fmt.Println("new ages: ", newAges)
    return
}

初學者對結構體的json序列化和反序列化比較清楚,對後兩種可能不多用,也不會用。後端

  • 對於數組類型數據,可是有些業務場景前端會使用。
  • 對於map類型,通常會在Go語言的服務端調用第三方REST接口時,服務端只想要指定的返回碼,判斷是否調用成功時。程序猿不想寫總體的struct結構體定義,也多是比較懶,而後用了一個map[string]interface{}去接收返回數據。這時候經過json標準庫中的Unmarshal反序列化後,而後經過map["err_code"].(int)獲取返回碼,而後再作其餘後續處理邏輯。

這裏還要說明一個結構體時,有時候我會用到的特性,結構體的json支持的標籤值特性omitempty,例如:數組

type Person struct {
    Name string `json:"name,omitempty"`
    Age int `json:"age"`
}

它表示,當函數omitempty的標籤值時,它所對應的結構體的數據元素值若是是零值,則它不會輸出。那就是說若是服務端返回的結構體數據中的某個元素爲空時,不返回給前端這個元素,就能夠使用omitempty的json標籤值屬性。函數

在這裏給你們提供一個滴滴公司的一位高級工程師taowen寫的json解析庫,世界上最快的。github地址:jsoniter學習

相關文章
相關標籤/搜索