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向实体类的转化,我们需要做的就是拼凑出一条合适的查询语句。