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中。