go中的json處理

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))
}

運行結果,第一行爲反序列化的結果,第二行爲序列化的結果。
在這裏插入圖片描述

4、參考鏈接

Go web

go-simplejson 文檔

go-simple 代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章