Golang如何优雅地提取JSON数据中需要的字段数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yjp19871013/article/details/83035588

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

猜你喜欢

转载自blog.csdn.net/yjp19871013/article/details/83035588