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

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值