iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go中使用gjson来操作JSON数据的实现
  • 449
分享到

Go中使用gjson来操作JSON数据的实现

2024-04-02 19:04:59 449人浏览 泡泡鱼
摘要

目录获取值路径解析JSON 行Result Type64-bit integers读取嵌套数组对象或数组迭代简易的Parse和Get检查value是否存在验证jsON反序列化到map

项目地址:https://GitHub.com/tidwall/gjson

下载:

$ Go get -u github.com/tidwall/gjson

获取值

Get查询指定路径, 通过.来区分. 比如"name.last"或者"age". 如果找到了匹配路径, 将返回结果.

package main
import "github.com/tidwall/gjson"
const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}`
func main() {
    value := gjson.Get(json, "name.last")
    println(value.String())
}

输出结果:

Prichard

同时有 GetMany 方法批量获取值, 也有 GetBytes 方法获取字节切片.

路径解析

路径是一系列被.分隔的key拼接而成. 路径可能包含通配符'*'和'?'. 通过下标访问数组值. 通过'#'来获取值在元素中的排位或访问子路径. .和通配符可以通过''来转义.

{
  "name": {"first": "Tom", "last": "Anderson"},
  "age":37,
  "children": ["Sara","Alex","Jack"],
  "fav.movie": "Deer Hunter",
  "friends": [
    {"first": "Dale", "last": "Murphy", "age": 44},
    {"first": "Roger", "last": "Craig", "age": 68},
    {"first": "Jane", "last": "Murphy", "age": 47}
  ]
}
"name.last"          >> "Anderson"
"age"                >> 37
"children"           >> ["Sara","Alex","Jack"]
"children.#"         >> 3
"children.1"         >> "Alex"
"child*.2"           >> "Jack"
"c?ildren.0"         >> "Sara"
"fav\.movie"         >> "Deer Hunter"
"friends.#.first"    >> ["Dale","Roger","Jane"]
"friends.1.last"     >> "Craig"

你同样能通过#[...]来查询数组中的第一个匹配的项, 或通过'#[...]#'查询所有匹配的项. 查询支持==, !=, <, <=, >, >=比较运算符和'%'模糊匹配.

friends.#[last=="Murphy"].first    >> "Dale"
friends.#[last=="Murphy"]#.first   >> ["Dale","Jane"]
friends.#[age>45]#.last            >> ["Craig","Murphy"]
friends.#[first%"D*"].last         >> "Murphy"

JSON 行

同样支持JSON Lines, 使用 .. 前缀, 把多行文档视作数组. 比如:

{"name": "Gilbert", "age": 61}
{"name": "Alexa", "age": 34}
{"name": "May", "age": 57}
{"name": "Deloise", "age": 44}
..#                   >> 4
..1                   >> {"name": "Alexa", "age": 34}
..3                   >> {"name": "Deloise", "age": 44}
..#.name              >> ["Gilbert","Alexa","May","Deloise"]
..#[name="May"].age   >> 57

ForEachLines 方法可以迭代json.

gjson.ForEachLine(json, func(line gjson.Result) bool{
    println(line.String())
    return true
})

Result Type

GJSON支持json类型包括 string, number, bool, and null. 数组和对象被挡住基础类型返回. Result 持有如下其中一种类型:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON string literals
nil, for JSON null

直接访问value:

result.Type    // can be String, Number, True, False, Null, or JSON
result.Str     // holds the string
result.Num     // holds the float64 number
result.Raw     // holds the raw json
result.Index   // index of raw value in original json, zero means index unknown

有各种各样的方便的函数可以获取结果:

result.Exists() bool
result.Value() interface{}
result.Int() int64
result.Uint() uint64
result.Float() float64
result.String() string
result.Bool() bool
result.Time() time.Time
result.Array() []gjson.Result
result.Map() map[string]gjson.Result
result.Get(path string) Result
result.ForEach(iterator func(key, value Result) bool)
result.Less(token Result, caseSensitive bool) bool

result.Value() 方法返回 interface{} Go基本类型之一. result.Array() 方法返回一组值. 如果结果是不存在的值, 将会返回空数组. 如果结果不是JSON数组, 将会返回只包含一个值的数组.

boolean >> bool
number  >> float64
string  >> string
null    >> nil
array   >> []interface{}
object  >> map[string]interface{}

64-bit integers

result.Int()result.Uint() 返回的是64位大数字.

result.Int() int64    // -9223372036854775808 to 9223372036854775807
result.Uint() int64   // 0 to 18446744073709551615

读取嵌套数组

假如你想从下列json获取所有的lastName:

{
  "programmers": [
    {
      "firstName": "Janet", 
      "lastName": "McLaughlin", 
    }, {
      "firstName": "Elliotte", 
      "lastName": "Hunter", 
    }, {
      "firstName": "Jason", 
      "lastName": "Harold", 
    }
  ]
}

你可以使用如下路径programmers.#.lastName:

result := gjson.Get(json, "programmers.#.lastName")
for _, name := range result.Array() {
    println(name.String())
}

你同样能获取数组里的对象:

name := gjson.Get(json, `programmers.#[lastName="Hunter"].firstName`)
println(name.String())  // prints "Elliotte"

对象或数组迭代

ForEach方法允许你快速的迭代对象或数组. key和value被传递给对象的迭代器函数. 只有value被传递给数组. 迭代器返回false将会终止迭代.

简易的Parse和Get

Parse(json)方法可以简单的分析json, result.Get(path)查询结果. 比如, 下面的几种情况都将返回相同的结果:

gjson.Parse(json).Get("name").Get("last")
gjson.Get(json, "name").Get("last")
gjson.Get(json, "name.last")

检查value是否存在

有时你想要知道值是否存在.

value := gjson.Get(json, "name.last")
if !value.Exists() {
    println("no last name")
} else {
    println(value.String())
}
// Or as one step
if gjson.Get(json, "name.last").Exists() {
    println("has a last name")
}

验证JSON

Get*Parse* 方法预期json格式是正常的, 如果不正常, 将会返回不可预料的结果. 如果你读取的json来源不可预料, 那么你可以通过GJSON这么事先验证.

if !gjson.Valid(json) {
    return errors.New("invalid json")
}
value := gjson.Get(json, "name.last")

反序列化到map

反序列化到map[string]interface{}:

m, ok := gjson.Parse(json).Value().(map[string]interface{})
if !ok {
    // not a map
}
## 处理Bytes
如果你的JSON包含字节数组切片, 与其调用`Get(string(data), path)`, 不如调用[GetBytes](Https://godoc.org/github.com/tidwall/gjson#GetBytes)方法更优.
```go
var json []byte = ...
result := gjson.GetBytes(json, path)

如果你在使用gjson.GetBytes(json, path)方法, 并且你想避免从result.Raw 转换到 []byte, 你可以使用这种模式:

var json []byte = ...
result := gjson.GetBytes(json, path)
var raw []byte
if result.Index > 0 {
    raw = json[result.Index:result.Index+len(result.Raw)]
} else {
    raw = []byte(result.Raw)
}

这是最好的模式, 不会为子切片重新分配内存. 这个模式使用了result.Index字段, 它直接指向了raw data所处原来json中的位置. 如果result.Raw是转换成[]byte的, result.Index将会为0.

一次获取多个值

GetMany方法可以用于同时获取多个值.

results := gjson.GetMany(json, "name.first", "name.last", "age")

返回值是[]Result类型, 总是返回正传入路径个数的数量.

到此这篇关于Go中使用gjson来操作JSON数据的实现的文章就介绍到这了,更多相关Go gjson操作JSON内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go中使用gjson来操作JSON数据的实现

本文链接: https://www.lsjlt.com/news/121038.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go中使用gjson来操作JSON数据的实现
    目录获取值路径解析JSON 行Result Type64-bit integers读取嵌套数组对象或数组迭代简易的Parse和Get检查value是否存在验证JSON反序列化到map...
    99+
    2024-04-02
  • C#中使用Spire.XLS来操作Excel数据的实现
    目录一、Spire.XLS的安装与引用二、Spire.XLS的基本用法1.打开和读取Excel文件2.读取工作表中的数据Spire.XLS是一个功能强大的C#组件,它提供了对Exce...
    99+
    2023-05-14
    C# Spire.XLS操作Excel C# 操作Excel
  • python 包实现JSON 轻量数据操作
    目录一、将对象转为json字符串二、格式化输出三、将json字符串转为对象四、安装demjson五、将对象转为json字符串六、将json字符串转为对象一、将对象转为json字符串 ...
    99+
    2024-04-02
  • MySql中使用JSON_TABLE 函数来实现json类型的数据查询
    使用 MySQL 8.0.4 及以上版本提供的 JSON_TABLE 函数来实现查询 id 在 3、4、5… 中的数据,示例如下: SELECT *FROM table_nameCROSS J...
    99+
    2023-10-06
    mysql json 数据库
  • Python操作JSON实现网络数据交换
    目录前言JSON是什么?JSON与XML的优劣差异?将Python对象编码成JSON字符串将JSON字符串解码为Python对象解决中文乱码问题前言 学学Python中操纵JSON的...
    99+
    2024-04-02
  • Go处理JSON数据的实现
    目录1. 结构体对象转 JSON 字符串2.  JSON 字符串转结构体对象3. 结构体切片转JSON字符串4. JSON字符串(JSON数组)转切片5. JSON 字符串...
    99+
    2023-02-17
    Go处理JSON Go JSON
  • springboot使用RedisRepository操作数据的实现
    目录一、一个属性、一个属性的存取二、使用Jackson2HashMapper存取对象三、使用RedisRepository的对象操作通过集成spring-boot-starter-d...
    99+
    2024-04-02
  • C#中怎么使用Spire.XLS来操作Excel数据
    这篇“C#中怎么使用Spire.XLS来操作Excel数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#中怎么使用Spi...
    99+
    2023-07-05
  • Go语言中如何使用索引来操作数组?
    Go语言是一门受欢迎的编程语言,它提供了许多方便易用的工具和API,其中包括数组。在Go语言中,数组是一种基本的数据结构,它可以存储一组具有相同数据类型的元素。当我们需要对数组进行操作时,索引是一个非常重要的概念。在本文中,我们将探讨如何使...
    99+
    2023-11-06
    索引 数组 存储
  • 如何使用 Go 中的容器实现高效的数组操作?
    在 Go 中,使用容器实现高效的数组操作是一项非常常见的任务。在本文中,我们将介绍如何使用 Go 中的容器实现高效的数组操作。 首先,我们需要了解 Go 中的容器是如何工作的。Go 中的容器分为两类:内置容器和自定义容器。内置容器包括数组、...
    99+
    2023-08-28
    容器 数组 shell
  • GO语言中怎么实现Mysql数据库的CURD操作
    这期内容当中小编将会给大家带来有关GO语言中怎么实现Mysql数据库的CURD操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、先导入驱动包和增强版Mysql操作库Sqlxpackage m...
    99+
    2023-06-20
  • 你知道如何在 Go 中使用容器来实现并发操作吗?
    当今的软件开发中,容器技术已经成为了一种非常流行的解决方案。特别是在 Go 语言中,容器技术更是成为了实现并发操作的一个重要工具。在本文中,我们将详细介绍如何在 Go 中使用容器来实现并发操作。 一、什么是容器技术? 在软件开发中,容器技术...
    99+
    2023-07-29
    shell 容器 并发
  • MySQL中使用JSON存储数据的实现示例
    目录1.概述:2.使用:3.查询:4.修改5.删除6.排序7.索引8.实现原理:参考资料:1.概述: mysql从5.7版本开始引入了对jsON数据类型的原生支持。这个增强功能使开发人员能够直接在数据库中存储、操作和查询...
    99+
    2023-09-21
    MySQL JSON存储数据 MySQL JSON存储
  • Go 中的 NumPy 数组:如何使用函数进行数据操作?
    Go 语言作为一种开源的编程语言,一直受到程序员的喜爱。尤其在数据科学和机器学习领域,Go 语言也有着不俗的表现。其中一个重要的数据处理工具是 NumPy 数组,它能够快速高效地处理数据。但是,在 Go 语言中如何使用 NumPy 数组呢?...
    99+
    2023-09-23
    数组 函数 numy
  • 如何在go语言中实现数据库操作的功能
    在Go语言中可以使用database/sql包来实现数据库操作的功能。以下是一个简单的示例代码,演示如何连接数据库、插入数据、查询数...
    99+
    2023-10-12
    Go语言
  • 大数据之Kafka————java来实现kafka相关操作
    一、在java中配置pom junit junit 4.11 test org.apache.kafka kafka-clients 2.8....
    99+
    2023-09-23
    大数据 kafka java
  • 如何使用jQuery来实现禁用滑轮的操作
    随着互联网技术不断更新和发展,许多网站都采用了JavaScript库来实现各种交互动画效果,其中一种常用的库就是jQuery,它简化了JavaScript的编写和操作,使得开发者可以更加轻松地完成各种交互效果,而且还提供了大量方便快捷的AP...
    99+
    2023-05-14
  • Springboot使用Spring Data JPA实现数据库操作
    SpringBoot整合JPA 使用数据库是开发基本应用的基础,借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC(Java Data Base Connec...
    99+
    2024-04-02
  • 如何使用 PHP Stream 实现数据流操作
    标题:PHP Stream 数据流操作指南 在Web开发中,数据流操作是非常常见的操作,可以用于读取文件内容、发送HTTP请求、处理网络数据等功能。PHP提供了强大的Stream功能,...
    99+
    2024-04-02
  • Java中使用MyBatis-Plus操作数据库的实例
    目录MyBatis-Plus官网使用测试数据插入数据库 测试查询所有 测试删除数据 测试修改数据MyBatis-Plus MyBatis-Plus (o...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作