Golang如何優雅地提取JSON資料中需要的欄位資料
JSON資料是我們開發中經常遇到的一種資料格式,一般通用的做法是,我們通過建立實體類,然後利用一些框架將JSON資料轉化為對應的實體類物件,這樣我們就可以方便地訪問JSON資料了。
但是有些時候,一個JSON物件很大,欄位很多,而我們可能只需要其中的幾個欄位值,這在呼叫第三方API時可能經常發生,我們完全沒有必要為了訪問幾個欄位而建立一個很大的實體類物件,使用過C#的開發者會很自然地想到LINQ,它可以很方便的幫助我們以查詢的方式獲取JSON中的欄位資料。
Golang中有一個開源包gojsonq可供選擇,它是解析JSON的LINQ語法的Golang實現,首先安裝這個包
go get github.com/thedevsaddam/gojsonq
該專案的github地址是https://github.com/thedevsaddam/gojsonq,上面有更多關於這個包的使用介紹。下面看一個例子,這個例子解析一個JSON檔案,將值獲取到後,寫入一個Excel檔案,因此還用了之前文章提到的xlsx包。
需要解析的JSON檔案內容很簡單
{ "status": 0, "dList": [ { "deviceName": "device1", "deviceId": "1", "position": "會議室1", "comments": "" }, { "deviceName": "device2", "deviceId": "2", "position": "會議室2", "comments": "" }, { "deviceName": "device3", "deviceId": "3", "position": "會議室3", "comments": "" }], "msg": "" }
我們需要提取deviceName,deviceId和position三個欄位,然後寫入一個Excel,程式碼如下
package main import ( "fmt" "os" "github.com/tealeg/xlsx" "github.com/thedevsaddam/gojsonq" ) const ( DEVICE_JSON_FILE = "./device_list.txt" ) func main() { jq := gojsonq.New().File(DEVICE_JSON_FILE).From("dList").Select("deviceName", "deviceId", "position") deviceInfoList, ok := jq.Get().([]interface{}) if !ok { fmt.Println("Convert deviceInfoList error") } xlsxFile := xlsx.NewFile() sheet, err := xlsxFile.AddSheet("Sheet 1") if err != nil { fmt.Println(err) os.Exit(1) } sheet.AddRow().WriteSlice(&[]string{"裝置名稱", "裝置ID", "位置"}, 3) for _, deviceInfo := range deviceInfoList { deviceInfoMap, ok := deviceInfo.(map[string]interface{}) if !ok { fmt.Println("Convert deviceInfoMap error") } row := sheet.AddRow() row.AddCell().SetValue(deviceInfoMap["deviceName"]) row.AddCell().SetValue(deviceInfoMap["deviceId"]) row.AddCell().SetValue(deviceInfoMap["position"]) } xlsxFile.Save("./result.xlsx") }
我們首先定義一個常量,指明JSON檔案路徑,在main函式中,第一句就是使用gojsonq的語句,這也是最關鍵的一句,這一條語句我們指明瞭載入的檔案,從檔案中的dList欄位對應的物件中提取需要的三個欄位,可以結合上上面的JSON檔案內容理解一下。
然後,呼叫jq的Get()方法,該方法會返回上面語句中的結果集,我們的結果集會是一個interface的陣列。結合上面的JSON檔案內容,這個結果集會有三個物件。
接下來建立Excel檔案和Sheet 1表單,利用AddRow()方法,寫入標題行,然後遍歷我們上面的結果集,結果集中的每一個物件是一個map,其中儲存著以deviceName,deviceId和position為鍵的資料,程式碼我們使用了另一種方式向Excel添加了單元格及內容。最後通過呼叫Save()儲存xlsx檔案。
使用gojsonq可以很方便的提取到我們需要的JSON中的欄位,避免了JSON向實體類的轉化,我們需要做的就是拼湊出一條合適的查詢語句。