最近我們的項目中遇到了一個大JSON的解析問題,使用了Golang來解決這個問題,在此分享下解決過程及代碼。
首先,我們需要了解一下Golang中的JSON相關包:
import ( "encoding/json" "fmt" )
其中,encoding/json包提供了一些方法用于JSON數據的編碼和解碼。
接下來,我們需要樣例JSON數據來進行解析。我們這里選擇了一個格式較為復雜的JSON:
{ "code": 200, "message": "success", "data": { "name": "張三", "age": 18, "gender": "male", "address": [ { "city": "上海", "district": "浦東新區", "detail": "祝橋鎮", "postcode": "212121" }, { "city": "南京", "district": "玄武區", "detail": "漢口路", "postcode": "232323" } ] } }
對于這個JSON數據,我們需要定義一個結構體來進行解析,如下:
type Response struct { Code int `json:"code"` Message string `json:"message"` Data Data `json:"data"` } type Data struct { Name string `json:"name"` Age int `json:"age"` Gender string `json:"gender"` Address []Address `json:"address"` } type Address struct { City string `json:"city"` District string `json:"district"` Detail string `json:"detail"` Postcode string `json:"postcode"` }
其中,結構體中的json標簽用于指定結構體中字段對應JSON中的字段名稱。
接下來,就可以使用unmarshal方法進行解析了:
var resp Response err := json.Unmarshal([]byte(jsonStr), &resp) if err != nil { fmt.Println(err) } fmt.Println(resp)
其中jsonStr為我們定義的樣例JSON數據。解析結果輸出為:
{200 success {張三 18 male [{上海 浦東新區 祝橋鎮 212121} {南京 玄武區 漢口路 232323}]}}
最后,我們需要注意的是在處理大JSON時,解析會相對較慢,需要注意優化解析速度。若需要處理大JSON文件,可以考慮使用bufio等方式進行分段讀取。