在golang開發中,常常需要解析JSON格式的字符串。但遇到復雜的JSON字符串時,會出現三層嵌套解析失敗的情況。
假如有一段JSON字符串如下:
{ "code": 200, "message": "success", "data": { "id": 1, "name": "apple", "prices": [ { "type": "high", "price": 5.0 }, { "type": "low", "price": 2.0 } ], "info": { "origin": "China", "weight": 1000 } } }
若需要取出info中的weight,可以通過以下代碼:
type Data struct { Id int `json:"id"` Name string `json:"name"` Prices []struct { Type string `json:"type"` Price float64 `json:"price"` } `json:"prices"` Info struct { Origin string `json:"origin"` Weight int `json:"weight"` } `json:"info"` } func main() { jsonString := "..." data := &Data{} err := json.Unmarshal([]byte(jsonString), data) if err != nil { panic(err) } fmt.Println(data.Info.Weight) }
但若需要解析出prices中的每個元素的類型和價格,則需要繼續嵌套:
type Price struct { Type string `json:"type"` Price float64 `json:"price"` } type Data struct { Id int `json:"id"` Name string `json:"name"` Prices []Price `json:"prices"` Info struct { Origin string `json:"origin"` Weight int `json:"weight"` } `json:"info"` } func main() { jsonString := "..." data := &Data{} err := json.Unmarshal([]byte(jsonString), data) if err != nil { panic(err) } for _, price := range data.Prices { fmt.Println(price.Type, price.Price) } }
當需要解析出每個price中的type和price時,需要將Price結構體單獨聲明,從而拆分數據。這時,就能成功解析出每個price中的type和price了。
總的來說,對于三層嵌套的JSON字符串,需要對每層數據進行拆分和嵌套聲明,從而才能正確解析。