简介
在日常工作中,每一名开发者,不管是前端还是后端,都经常使用 JSON。JSON 是一个很简单的数据交换格式。相比于 XML,它灵活、轻巧、使用方便。JSON 也是RESTful API推荐的格式。有时,我们只想读取 JSON 中的某一些字段。如果自己手动解析、一层一层读取,这就变得异常繁琐了。特别是在嵌套层次很深的情况下。今天我们介绍gojsonq
。它可以帮助我们很方便的操作 JSON。
快速使用
先安装:
$ go get github.com/thedevsaddam/gojsonq
后使用:
package main
import (
"fmt"
"github.com/thedevsaddam/gojsonq"
)
func main() {
content := `{
"user": {
"name": "dj",
"age": 18,
"address": {
"provice": "shanghai",
"district": "xuhui"
},
"hobbies":["chess", "programming", "game"]
}
}`
gq := gojsonq.New().FromString(content)
district := gq.Find("user.address.district")
fmt.Println(district)
gq.Reset()
hobby := gq.Find("user.hobbies.[0]")
fmt.Println(hobby)
}
操作非常简单:
- 首先调用
gojsonq.New()
创建一个JSONQ
的对象; - 然后就可以使用该类型的方法来查询属性了。
上面代码我们直接读取位于最内层的district
值和hobbies
数组的第一个元素!层与层之间用.
隔开,如果是数组,则在属性字段后通过.[index]
读取下标为index
的元素。这种方式可以实现很灵活的读取。
注意到一个细节:在查询之后,我们手动调用了一次Reset()
方法。因为JSONQ
对象在调用Find
方法时,内部会记录当前的节点,下一个查询会从上次查找的节点开始。也就是说如果我们注释掉jq.Reset()
,第二个Find()
方法实际上查找的是user.address.district.user.hobbies.[0]
,自然就返回nil
了。除此之外,gojsonq
也提供了另外一种方式。如果你想要保存当前查询的一些状态信息,可以调用JSONQ
的Copy
方法返回一个初始状态下的对象,它们会共用底层的 JSON 字符串和解析后的对象。上面的gq.Reset()
可以由下面这行代码代替:
gpCopy := gp.Copy()
后面就可以使用gpCopy
查询hobbies
了。</