1. 程式人生 > >Golang如何優雅地提取JSON資料中需要的欄位資料

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向實體類的轉化,我們需要做的就是拼湊出一條合適的查詢語句。