博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何用Go访问深层嵌套的JSON数据?
阅读量:6701 次
发布时间:2019-06-25

本文共 4669 字,大约阅读时间需要 15 分钟。

大多数情况下,开发人员需要使用来自其他服务的JSON数据并对其进行查询。查询JSON文档非常耗时。在过去的几天里,我正在为Golang编写一个包,以便轻松查询JSON数据。这个想法和灵感来自 Nahid Bin Azhar的PHP-JSONQ。

我们来看一个示例JSON数据:

{   "name":"computers",   "description":"List of computer products",   "vendor":{      "name":"Star Trek",      "email":"info@example.com",      "website":"www.example.com",      "items":[         {"id":1, "name":"MacBook Pro 13 inch retina","price":1350},         {"id":2, "name":"MacBook Pro 15 inch retina", "price":1700},         {"id":3, "name":"Sony VAIO", "price":1200},         {"id":4, "name":"Fujitsu", "price":850},         {"id":5, "name":"HP core i5", "price":850, "key": 2300},         {"id":6, "name":"HP core i7", "price":950},         {"id":null, "name":"HP core i3 SSD", "price":850}      ],      "prices":[         2400,         2100,         1200,         400.87,         89.90,         150.10     ]   }}

让我们找到一个深度嵌套的属性并正确处理错误,在这种情况下,我们将尝试nameitems数组的第二个元素进行访问,注意:itemsvendor对象的属性。

请参阅以下示例:

package mainimport (    "fmt"    "log"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.Find("vendor.items.[1].name")    if jq.Error() != nil {        log.Fatal(jq.Errors())    }    fmt.Println(res)}

Yahooooo!很简单吧?它看起来像使用ORMJSON数据。让我们看一些更多示例来查询示例数据。

例1

查询: select * from vendor.items where price > 1200 or id null

使用我们可以执行以下查询:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).OrWhere("id", "=", nil).Get()    fmt.Println(res)    // output: [map[price:1350 id:1 name:MacBook Pro 13 inch retina] map[id:2 name:MacBook Pro 15 inch retina price:1700] map[id:
name:HP core i3 SSD price:850]]}

例2

查询: select name, price from vendor.items where price > 1200 or id null

使用我们可以执行以下查询:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).OrWhere("id", "=", nil).Only("name", "price")    fmt.Println(res)    // output: [map[name:MacBook Pro 13 inch retina price:1350] map[name:MacBook Pro 15 inch retina price:1700] map[name:HP core i3 SSD price:850]]}

例3

查询: select sum(price) from vendor.items where price > 1200 or id null

使用我们可以执行以下查询:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).OrWhere("id", "=", nil).Sum("price")    fmt.Println(res)    // output: 3900}

例4

查询: select price from vendor.items where price > 1200

使用我们可以执行以下查询:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).Pluck("price")    fmt.Println(res)    // output: [1350 1700]}

例5

查询: select * from vendor.items order by price

使用我们可以执行以下查询:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").SortBy("price").Get()    fmt.Println(res)    // output: [map[id:
name:HP core i3 SSD price:850] map[id:4 name:Fujitsu price:850] map[id:5 name:HP core i5 price:850 key:2300] map[id:6 name:HP core i7 price:950] map[id:3 name:Sony VAIO price:1200] map[id:1 name:MacBook Pro 13 inch retina price:1350] map[id:2 name:MacBook Pro 15 inch retina price:1700]]}

例6

使用您可以正确处理错误,请参阅下面的代码段:

package mainimport (    "log"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./invalid-file.xjsn")    err := jq.Error()    if err != nil {        log.Fatal(err)        // 2018/06/25 00:48:58 gojsonq: open ./invalid-file.xjsn: no such file or directory        // exit status 1    }}

例7

假设我们有一个像这样的JSON文档

{  "users":[    {      "id":1,      "name":{        "first":"John",        "last":"Ramboo"      }    },    {      "id":2,      "name":{        "first":"Ethan",        "last":"Hunt"      }    },    {      "id":3,      "name":{        "first":"John",        "last":"Doe"      }    }  ]}

我们想要运行这样的查询:

查询: select * from users where name.first=John

使用该软件包可以轻松进行查询,请参阅下面的代码段:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./data.json")    res := jq.From("users").WhereEqual("name.first", "John").Get()    fmt.Println(res) //output: [map[id:1 name:map[first:John last:Ramboo]] map[id:3 name:map[first:John last:Doe]]]}

您可以使用DOT(。)访问嵌套级别属性,例如Where/GroupBy/SortBy etc

注意:还有一些其他有用的方法可以让生活更轻松!如果您喜欢该软件包,请不要忘记与您的社区分享并为存储库加注星标

转载地址:http://sswlo.baihongyu.com/

你可能感兴趣的文章
JDK1.8 ArrayList部分源码分析小记
查看>>
R语言机器学习框架h2o基础学习教程
查看>>
java9系列(二)docker运行java9
查看>>
JSON的理解
查看>>
LeetCode: Binary Tree Maximum Path Sum
查看>>
1.平凡之路-ORM概述
查看>>
Electron(1.6.11) + koa2 仿腾讯TGP游戏登录器(一):环境部署
查看>>
es8的字符串填充、关于对象、关于函数
查看>>
开源情报订阅OpenTaxii+mysql+nginx 配置教程
查看>>
关于$.Callbacks()传参问题
查看>>
专注服务,而非容器
查看>>
关于css命名的一点思考,探讨一下css命名空间的可行性
查看>>
CSS进阶篇--你用过css3的这个currentColor新属性吗?使用与兼容性
查看>>
[MachineLearing]6步进入机器学习领域(译)
查看>>
二列布局
查看>>
AdminLTE For Laravel 后台模板
查看>>
magento2开发,你可能需要补充的知识点
查看>>
字母和数字键的键码值(keyCode)
查看>>
Gradle之恋-Init插件
查看>>
获得包含中英文字符串的自然长度
查看>>