Go語言中的json包提供了一種解析和生成JSON數據的方式。但是在實際開發中,我們可能會遇到一些未知的JSON結構,這就需要我們使用一些特殊的技巧來處理它們。
對于未知結構的JSON數據,我們可以先將其解析為map[string]interface{}類型,這個結構可以存儲任意類型的值,并且在遇到未知類型的數據時,會自動轉化為對應的值類型。
package main import ( "encoding/json" "fmt" ) func main() { data := `{ "name": "張三", "age": 18, "hobby": ["籃球", "旅游"], "info": { "city": "北京", "address": "海淀區" } }` var m map[string]interface{} err := json.Unmarshal([]byte(data), &m) if err != nil { fmt.Println(err) } else { fmt.Println(m["name"].(string)) fmt.Println(m["age"].(float64)) fmt.Println(m["hobby"].([]interface{})[0].(string)) fmt.Println(m["info"].(map[string]interface{})["city"].(string)) } }
在上面的代碼中,我們對一個未知結構的JSON數據進行了解析,結果得到了一個類型為`map[string]interface{}`的變量m。可以看到,無論是字符串、數字還是列表,都被正確解析出來了。
但是,使用這種方法有一個缺陷,就是所有的訪問都需要進行類型斷言,這會讓代碼變得很臃腫不優雅。這時我們可以使用第三方庫,如github.com/bitly/go-simplejson,來簡化流程。
package main import ( "fmt" "github.com/bitly/go-simplejson" ) func main() { data := `{ "name": "張三", "age": 18, "hobby": ["籃球", "旅游"], "info": { "city": "北京", "address": "海淀區" } }` js, err := simplejson.NewJson([]byte(data)) if err != nil { fmt.Println(err) } else { fmt.Println(js.Get("name").MustString()) fmt.Println(js.Get("age").MustInt()) fmt.Println(js.Get("hobby").MustArray()[0]) fmt.Println(js.Get("info").Get("city").MustString()) } }
在使用go-simplejson時,我們可以使用Get方法直接訪問一個節點的值,并且可以在鏈式調用中方便地處理嵌套結構。
總的來說,對于未知結構的JSON數據,我們可以通過自帶的map[string]interface{}類型或者第三方庫來進行處理。雖然代碼需要額外的處理,但是這種處理方式可以讓我們更靈活地處理各種類型的JSON數據。
上一篇vue chimee
下一篇python 貝葉斯因子