原文来自https://hashnode.com/post/how...

大多数情况下,开发人员需要使用来自其他服务的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

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

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:<nil> name:HP core i3 SSD price:850]]
}

例2

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

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

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

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

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

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

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

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

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:<nil> 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

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

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

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

如何用Go访问深层嵌套的JSON数据?相关推荐

  1. 实体类多层嵌套 遍历_多层嵌套的json数据

    很多时候我们见到的json数据都是多层嵌套的,就像下面这般: {"name":"桔子桑","sex":"男"," ...

  2. 嵌套的JSON数据与AVRO文件的相互转换

    JSON是一种常用的数据交换格式,很多系统都会使用JSON作为数据接口返回的数据格式,然而,由于JSON数据中包含大量的字段名字,导致空间的严重浪费,尤其是数据文件较大的时候,而AVRO是一种更加紧凑 ...

  3. ajax 循环html元素,AJAX返回API数据并使用jQuery循环遍历嵌套的JSON数据

    我使用AJAX连接到返回JSON对象的API(请参阅下面的JSON代码参考),并试图循环并解析要在HTML元素内部呈现的JSON数据.AJAX返回API数据并使用jQuery循环遍历嵌套的JSON数据 ...

  4. fastjson 修改多层嵌套的Json数据

    文章目录 一.需求 二.期望效果 三.实现 四.总结 一.需求 操作多层嵌套的Json数据,修改key值或删除key,然后更新原始Json数据 二.期望效果 删除原始Json中query-->b ...

  5. 怎么把嵌套的json数据改为整齐的格式

    如果要把嵌套的 JSON 数据转换为整齐的格式,可以使用 JSON 格式化工具.许多文本编辑器都支持对 JSON 文件的格式化,也可以使用在线的 JSON 格式化工具.如果要使用代码实现,可以使用 P ...

  6. java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)

    2018.11.14日更新 前言 没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐 在这一个月的项目中,总是用到JSONMo ...

  7. vue项目打包之后放在服务器上测试的时候访问不到本地json数据的解决方法

    上面的代码表示在本地开发项目时模拟后端数据.项目打包之后放在服务器上,json的路径需要按照原来的json实际路径放置才会访问到(/api/index.json)

  8. JS读取嵌套的JSON数据

    例1 var json = { contry:{ area:{ man:"12万", women:"10万" } } };//方式:使用eval解析 var o ...

  9. Python深层解析json数据之JsonPath

    我们在做接口自动化时,一般接口响应的都是json数据体,对响应数据进行提取使用或断言,当数据量很大或层级很深时,就会变得很麻烦,于是就可以用到jsonpath模块,解决json路径深取值难的问题. 一 ...

最新文章

  1. 关于android相机开发中遇到的内存溢出的问题
  2. Pipenv: Python包管理神器
  3. 四十四、Hexo搭建自己的博客
  4. Web开发静态资源处理---SpringBoot
  5. 让360安全浏览器默认使用谷歌内核
  6. 02-04 Python库-faker
  7. import torch报错 from torch._C import * ImportError: DLL load failed: 找不到指定的程序。解决办法
  8. Delphi 使用 Visual Studio Shell , 开源为期不远
  9. 蒙特卡洛模型——有约束的非线性规划问题
  10. ERwin Data Modeler数据库建模工具使用纪要
  11. 精益创业:创业2年被京东收购、今夜酒店特价创始人任鑫的反省
  12. Unity 敌人AI战斗系统
  13. ATM维护人员教大家正确使用银行卡和取款机
  14. TwinCAT3读取CSV文件
  15. 【点云压缩】Lossless Coding of Point Cloud Geometry using a Deep Generative Model
  16. [转载]interp1
  17. 关于GLMM(generalized linear mixed model)广义线性混合模型
  18. 最新Linux版本 jira6.3.6安装汉化破解以及数据迁移
  19. C++无法在头文件中定义string类数据
  20. React Native沿交叉轴的对其方式

热门文章

  1. JS 的省市区三级联动
  2. 命令模式(command line)
  3. CSS - 移动端布局(二)移动端适配
  4. 【《Unity Shader入门精要》 提炼总结】(九)第九章·UV贴图纹理概念介绍单张纹理的应用Shader常见函数总结
  5. 教你如何利用灰度图透明效果制作隐藏图片.part1
  6. 34 进程 pid ppid 并发与并行,阻塞与非阻塞 join函数 process对象 孤儿进程与僵尸进程...
  7. 转来得笑话(笑死人不偿命)
  8. 各种cdn插件下载或引入链接
  9. easyui acceptChanges 更新无法获取数据
  10. css3实现 png 图片高亮自左到右过渡的方式 (一张图实现不遮住png的透明背景)