在golang的json包中,提供了對(duì)JSON格式的支持,其中最核心的函數(shù)Unmarshal
將JSON數(shù)據(jù)解析為go語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)。
func Unmarshal(data []byte, v interface{}) error
第一個(gè)參數(shù)是JSON數(shù)據(jù),第二個(gè)參數(shù)是一個(gè)指向目標(biāo)類(lèi)型的指針,例如 &[]string{"apple", "banana"}
在Unmarshal函數(shù)中,使用了一個(gè)parse函數(shù)對(duì)輸入數(shù)據(jù)進(jìn)行解析,返回一個(gè)*value類(lèi)型的指針。
func (d *decodeState) parse() (v *value, err error)
整個(gè)Unmarshal函數(shù)的流程如下:
- 調(diào)用parse函數(shù)解析json數(shù)據(jù)
- 調(diào)用傳入的valueUnmarshaler函數(shù),將解析后的數(shù)據(jù)存儲(chǔ)到目標(biāo)結(jié)構(gòu)體中
對(duì)于復(fù)雜的數(shù)據(jù)類(lèi)型,可以使用解構(gòu)體來(lái)進(jìn)行反序列化,但是需要在結(jié)構(gòu)體中加上特殊的標(biāo)簽來(lái)標(biāo)明對(duì)應(yīng)的json字段名字,例如:
type Fruit struct { Name string `json:"name"` Color string `json:"color"` }
這里的json標(biāo)簽就是告訴Unmarshal函數(shù),對(duì)應(yīng)的json數(shù)據(jù)應(yīng)該取哪些字段作為當(dāng)前結(jié)構(gòu)體的字段。
最后,golang的json包中還提供了一些其他的功能,例如Encoder、Decoder等來(lái)進(jìn)行Json數(shù)據(jù)的編解碼操作,可以便捷地將數(shù)據(jù)存儲(chǔ)為json格式、從json數(shù)據(jù)中讀取數(shù)據(jù)等。