在Go語(yǔ)言中,JSON是非常常用的數(shù)據(jù)傳輸格式,很多時(shí)候我們需要將結(jié)構(gòu)體轉(zhuǎn)換成JSON字符串,或者從JSON字符串解析成結(jié)構(gòu)體。當(dāng)我們使用JSON解析時(shí),往往需要使用指針來引用結(jié)構(gòu)體,這樣才能夠修改JSON數(shù)據(jù)。
在Go語(yǔ)言中,有兩種方法可以使用JSON指針:
1. 使用json.RawMessage
type SomeStruct struct { ... MyJSON json.RawMessage `json:"my_json"` }
使用json.RawMessage,我們可以直接將json數(shù)據(jù)賦值給這個(gè)字段,而不需要先解析為結(jié)構(gòu)體,然后再進(jìn)行json.Marshal和json.Unmarshal。
使用指針解析JSON數(shù)據(jù):
var myStruct SomeStruct if err := json.Unmarshal(myJSONBytes, &myStruct); err != nil { // handle error } var myJSON map[string]interface{} if err := json.Unmarshal(myStruct.MyJSON, &myJSON); err != nil { // handle error } myJSON["some_key"] = "new_value" myJSONBytes, err := json.Marshal(myJSON) if err != nil { // handle error } myStruct.MyJSON = json.RawMessage(myJSONBytes)
2. 使用json.Unmarshal和json.Marshal的指針參數(shù)
type SomeStruct struct { ... MyJSON map[string]interface{} `json:"my_json"` } var myStruct SomeStruct if err := json.Unmarshal(myJSONBytes, &myStruct); err != nil { // handle error } myStruct.MyJSON["some_key"] = "new_value" myJSONBytes, err := json.Marshal(&myStruct.MyJSON) if err != nil { // handle error } myStruct.MyJSON = nil // 可選,釋放內(nèi)存
解析JSON數(shù)據(jù)時(shí),我們將結(jié)構(gòu)體字段的指針傳遞給Unmarshal函數(shù),然后直接使用該指針修改JSON數(shù)據(jù)。在生成JSON數(shù)據(jù)時(shí),我們將map[string]interface{}的指針傳遞給Marshal函數(shù),然后直接將生成的JSON字符串保存在結(jié)構(gòu)體的字段中。