Go語(yǔ)言中的JSON包提供了一系列操作JSON數(shù)據(jù)的函數(shù)。當(dāng)我們?cè)诓僮鱆SON數(shù)據(jù)時(shí),有時(shí)會(huì)遇到空數(shù)組的情況。那么Golang的JSON包是怎么處理空數(shù)組的呢?
type NullSlice []interface{} func (ns *NullSlice) UnmarshalJSON(b []byte) error { if string(b) == "null" { return nil } return json.Unmarshal(b, (*[]interface{})(ns)) }
上面是Go語(yǔ)言JSON包中的一個(gè)空數(shù)組處理的解決方案——利用了空接口和切片的特性。我們定義了一個(gè)空接口切片NullSlice,然后為其定義了一個(gè)UnmarshalJSON函數(shù),該函數(shù)用于把JSON字符串解析成NullSlice。
當(dāng)我們用json.Unmarshal函數(shù)解析一個(gè)JSON字符串的時(shí)候,會(huì)先判斷該字符串是否為null。如果是null,則返回nil,否則使用原本的json的Unmarshal函數(shù)把JSON字符串解析成[]interface{}切片,最后把這個(gè)切片轉(zhuǎn)變?yōu)槲覀兌x的NullSlice類型。
type User struct { Name string Age int Hobbies NullSlice } func main() { str := `{ "Name": "Alice", "Age": 30, "Hobbies": [] }` var u User json.Unmarshal([]byte(str), &u) fmt.Println(u) }
這里我們定義了一個(gè)User結(jié)構(gòu)體,其中包含了一個(gè)NullSlice類型的Hobbies成員。我們使用json.Unmarshal函數(shù)解析一個(gè)字符串,該字符串包含了一個(gè)空數(shù)組。運(yùn)行上面的代碼,我們會(huì)發(fā)現(xiàn)輸出結(jié)果如下:
{Alice 30 []}
我們可以看到,解析后的結(jié)果中,空數(shù)組變成了空的NullSlice類型,并被輸出。
總的來(lái)說(shuō),Go語(yǔ)言的JSON包對(duì)空數(shù)組的處理比較好,其解決方案給我們提供了很好的指導(dǎo)。當(dāng)我們?cè)诓僮鱆SON數(shù)據(jù)時(shí)遇到空數(shù)組的情況,可以自己定義一個(gè)類型,然后實(shí)現(xiàn)UnmarshalJSON函數(shù)即可,讓空數(shù)組直接變成自定義的類型,并在后續(xù)的操作中方便使用。