【Go學習筆記9】go語言中的工具包-json

zhongzhong05發表於2017-12-11

json編碼和解碼

在go語言中內建了對於json資料的編碼和解碼工具。關於json格式資料的操作都在json包中。

解碼

假設我們有下面這樣的一份json資料:

{
  "success" :true,
  "total": 1214,
  "rows":[{
    "id":1,
    "name":"zhongzhong",
    "age": 25
  },{
    "id":2,
    "name":"wangerxiao",
    "age":15
  }]
}
複製程式碼
package main

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

type user struct{
	Id int `json:"id"`
	Name string `json:"name"`
	Age int `json:"age"`
}
type userRes struct{
	Success bool `json:"success"`
	Total int `json:"total"`
	Users []user `json:"rows"`
}

func main(){
	res ,err := http.Get("http://127.0.0.1:8080/data.json")
	if err != nil{
		log.Println("請求資料出錯。。",err)
		return 
	}
  //這裡表示延遲到改函式最後執行
	defer res.Body.Close()
  
	var ur userRes
	err = json.NewDecoder(res.Body).Decode(&ur)

	if err != nil{
		log.Println("解析返回結果出錯。。")
		return
	}

	fmt.Println(ur)
}
//{true 1214 [{1 zhongzhong 25} {2 wangerxiao 15}]}
複製程式碼

上面的程式碼中,定義了兩個自定義型別,一個user型別,一個userRes型別。其中,在每一個屬性後面都新增了一個反引號的字串。這個字串在go語言中表示標籤。在與json資料匹配的時候,就是根據這些標籤裡面指定的來匹配資料的。如果不指定這些標籤,那麼go語言會根據屬性的名稱來配置,在匹配過程中屬性名稱不區分大小寫。

所以,上面的user型別的標籤都可以省略,而userRes型別中,除了Users屬性之外,其他的都可以省略。

編碼

還是以上面的資料為目標,我們來編碼出這樣的json格式資料。

package main

import (
	"log"
	"fmt"
	"encoding/json"
)

type user struct{
	Id int `json:"id"`
	Name string `json:"name"`
	Age int `json:"age"`
}
type userRes struct{
	Success bool `json:"success"`
	Total int `json:"total"`
	Users []user `json:"rows"`
}

func main(){
  //構造資料
	ur := userRes{
		Success: true ,
		Total: 1214 ,
		Users: []user{{1,"zhongzhong",25}},//這裡使用字面量初始化一條記錄
	}
  //使用append函式追加一條記錄
	ur.Users = append(ur.Users,user{2,"wangerxiao",15})
  
  //使用MarshalIndent來將ur物件轉換為json字串
  //這個函式返回一個byte型別的切片,和一個error值
	data, err := json.MarshalIndent(ur,"","	")

	if err != nil{
		log.Println("編碼錯誤",err)
		return 
	}
  //這裡需要將byte型別的切片轉換為string型別
	fmt.Println(string(data))
}

//
//{
//	"success": true,
//	"total": 1214,
//	"rows": [
//		{
//			"id": 1,
//			"name": "zhongzhong",
//			"age": 25
//		},
//		{
//			"id": 2,
//			"name": "wangerxiao",
//			"age": 15
//		}
//	]
//}
複製程式碼

那麼如果我想將物件轉換為json字串之後,輸出到檔案中該怎麼做呢?看下面的程式碼:

package main

import (
	"os"
	"log"
	"encoding/json"
)

type user struct{
	Id int `json:"id"`
	Name string `json:"name"`
	Age int `json:"age"`
}
type userRes struct{
	Success bool `json:"success"`
	Total int `json:"total"`
	Users []user `json:"rows"`
}

func main(){
	ur := userRes{
		Success: true ,
		Total: 1214 ,
		Users: []user{{1,"zhongzhong",25}},
	}

	ur.Users = append(ur.Users,user{2,"wangerxiao",15})

	file , err := os.OpenFile("data.json",os.O_CREATE | os.O_WRONLY | os.O_APPEND,0666)

	if err != nil{
		log.Println("開啟檔案失敗",err)
		return
	}

	json.NewEncoder(file).Encode(ur)
}
複製程式碼

上面的程式碼執行之後,就會將ur轉換為字串,並且寫入到檔案data.json中。

相關文章