go中的json處理
JSON(Javascript Object Notation)是一種輕量級的數據交換語言,以文字爲基礎,具有自我描述性且易於讓人閱讀。JSON由於比XML更小、更快,更易解析,以及瀏覽器的內建快速解析支持,使得其更適用於網絡數據傳輸領域。
1、JSON解析
json解析也叫json反序列化,相關函數爲Unmarshal()
,關於這個函數我們可以通過查看相關代碼得到他的實現方法。
func Unmarshal(data []byte, v interface{}) error
通過進一步查看我們就可以得到json反序列化時候採用的方法了。相關內容在decode.go
文件中,大致流程就是
-
查找tag含有相關字符的可導出的struct字段(首字母大寫)
-
查找字段名是相關字符的導出字段
-
查找除了首字母之外其他大小寫不敏感的導出字段
JSON的解析包括常見以下兩種:
- 解析到結構體(知道數據格式)
- 解析到interface(不知道數據格式)
2、JSON生成
json的生成也叫json序列化,相關函數爲Marshal
通過查看相關代碼我也能看到他的實現方法和Unmarshal
邏輯類似:
func Marshal(v interface{}) ([]byte, error)
相關函數實現都在encode
函數中。 在json序列化的時候需要注意以下幾點:
-
字段的tag是
"-"
,那麼這個字段不會輸出到JSON -
tag中帶有自定義名稱,那麼這個自定義名稱會出現在JSON的字段名中。
-
tag中如果帶有
"omitempty"
選項,那麼如果該字段值爲空,就不會輸出到JSON串中 -
如果字段類型是bool, string, int, int64等,而tag中帶有
",string"
選項,那麼這個字段在輸出到JSON的時候會把該字段對應的值轉換成JSON字符串 -
JSON對象只支持string作爲key,所以要編碼一個map,那麼必須是map[string]T這種類型(T是Go語言中任意的類型)
-
Channel, complex和function是不能被編碼成JSON的
-
嵌套的數據是不能編碼的,不然會讓JSON編碼進入死循環
-
指針在編碼的時候會輸出指針指向的內容,而空指針會輸出null
3、代碼實例
package main
import (
"encoding/json"
"fmt"
)
type Server struct {
ServerAddr string
ServerName string
ServerIP string
}
type Serverslice struct {
Servers []Server
}
func main() {
var s Serverslice
str := `{"servers":[{"ServerAddr":"Shannxi", "serverName":"Shannxi_v","serverIP":"192.168.1.1"},{"ServerAddr": "Guangdong", "serverName":"Guangdong_V","serverIP":"192.168.1.2"},{"ServerAddr": "Beijing", "serverName":"Beijing_V","serverIP":"192.168.1.3"}]}`
//json解析 反序列化
json.Unmarshal([]byte(str), &s)
fmt.Println(s)
//json生成 序列化
n, _ := json.Marshal(s)
fmt.Println(string(n))
}
運行結果,第一行爲反序列化的結果,第二行爲序列化的結果。