操做JSON數據

JSON格式

  • JavaScript對象表示法(JSON)是一種用於發送和接收結構化信息的標準協議。
  • JSON是對JavaScript中各類類型的值——字符串、數字、布爾值和對象——Unicode文本編碼。
  • Go語言對於這些標準格式的編碼和解碼都有良好的支持,由標準庫中的encoding/json、encoding/xml、encoding/asn1等包提供支持。

編碼

  • 待編碼的結構體能夠在聲明中添加元信息來輔助json操做。
  • 結構體字段的元信息在字段聲明的尾部使用字面值表示即被反單引號包圍。
  • 元信息格式爲json:"內容",其中內容能夠指定解析後的字段名,添加omitempty可使編碼時跳過零值字段。
  • 須要編碼的字符首字母必須大寫,即爲可導出的字段。

解碼

  • 解碼須要有json內容對應的結構體來接收。
  • 未出如今結構體中的數據將不解析。
  • 結構體字段首字母小寫的也不會被解析。

實例

  • 除了json.MarShaljson.UnMarShal也提供了json.Encodejson.Decode數據流方式的操做。
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

type Info struct {
	Name   string
	Sex    byte `json:"性別,omitempty"`
	Age    int
	adress string // 小寫名稱不會被解析
}

func main() {

	infos := []Info{
		{Name: "張三", Sex: 0, Age: 21, adress: "湖北"},
		{Name: "李四", Sex: 1, Age: 20, adress: "湖北"},
		{Name: "王五", Sex: 1, Age: 19, adress: "湖北"},
		{Name: "趙六", Sex: 0, Age: 18, adress: "湖北"},
	}

	// 編碼
	jsonStr, err := json.MarshalIndent(infos, "", "  ") // json.Marshal 無空格輸出
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println("編碼結果:\n", string(jsonStr))

	// 解碼
	var data []struct{ Name string }
	err = json.Unmarshal(jsonStr, &data)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Printf("解碼結果: \n %#v \n", data)

	TestNewDecode()
}

func TestNewDecode() {

	// json.NewDecode 針對數據流操做
	var commitInfo struct{ Node_id, Url, Html_url string }
	resp, err := http.Get("https://api.github.com/repos/golang/go/git/commits/db66972359073ce2f83c9863d77444eca5a73006")
	if err != nil {
		fmt.Println(err.Error())
	}
	defer resp.Body.Close()
	err = json.NewDecoder(resp.Body).Decode(&commitInfo)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Printf("Decode結果:\n %#v \n", commitInfo)
}
相關文章
相關標籤/搜索