Go 语言 json解析框架与 gjson 详解

Go 语言 json解析框架与 gjson 详解

介绍

在 Golang 中,解析 JSON 数据是一项非常常见的任务。Go提供了标准的JSON包,可以轻松地将JSON数据编组和解组。但是,在使用标准JSON包解析大型复杂JSON结构时,可能存在些许不足,例如代码冗余,性能瓶颈等问题。针对这些问题,目前有许多优秀的JSON解析框架,GJSON是其中一个很不错的选择。本文将详细讲解如何使用GJSON框架解析JSON数据。

安装

GJSON模块可以通过go get命令来安装。

go get github.com/tidwall/gjson

示例1 - JSON数据解析

我们可以通过一段简单的JSON数据来展示GJSON的具体使用方法。

{
    "name": {
        "first": "Tom",
        "last": "Jerry"
    },
    "age": 20,
    "hobbies": [
        "sport",
        "music",
        "reading"
    ]
}

获取简单的值

我们可以使用gjson.Get函数访问JSON数据的属性。下面是一些例子:

package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonData := `{"name": {"first": "Tom", "last": "Jerry"}, "age": 20, "hobbies":["sport","music","reading"]}`

    name := gjson.Get(jsonData, "name")
    first := gjson.Get(jsonData, "name.first")
    last := gjson.Get(jsonData, "name.last")
    age := gjson.Get(jsonData, "age")
    hobbies := gjson.Get(jsonData, "hobbies")

    fmt.Println("Name:", name)
    fmt.Println("First:", first)
    fmt.Println("Last:", last)
    fmt.Println("Age:", age)
    fmt.Println("Hobbies:", hobbies)
}

输出结果:

Name: {"first":"Tom","last":"Jerry"}
First: Tom
Last: Jerry
Age: 20
Hobbies: ["sport","music","reading"]

访问复杂的属性

GJSON提供了一个具有强大的语法来访问JSON任意节点。我们可以使用.(点)或.[](点括号)来访问节点。下面例子分别演示了访问数组、普通节点、以及数组节点中的一项元素。

package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonData := `{"name": {"first": "Tom", "last": "Jerry"}, "age": 20, "hobbies":["sport","music","reading"]}`

    hobby1 := gjson.Get(jsonData, "hobbies.0")
    allHubbies := gjson.Get(jsonData, "hobbies")
    firstName := gjson.Get(jsonData, "name.first")
    nameString := gjson.Get(jsonData, "name.first") + " " + gjson.Get(jsonData, "name.last")

    fmt.Println("Hobby1:", hobby1)
    fmt.Println("All Hubbies:", allHubbies)
    fmt.Println("First Name:", firstName)
    fmt.Println("Name String:", nameString)
}

输出结果:

Hobby1: sport
All Hubbies: ["sport","music","reading"]
First Name: Tom
Name String: Tom Jerry

访问非字符串值

当你的JSON数据包含非字符串值时,你可以使用各种类型的JSON类型进行解析。下面是一些可用类型:

方法 描述
Bool() 尝试将此值转换为布尔型。
Float64() 尝试将此值转换为float64。
Int() 尝试将此值转换为int64。
Uint64() 尝试将此值转换为uint64。
String() 获取字符串版本(或数字,布尔值等)。

下面是一个使用不同类型的例子:

package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonData := `{"value": "42", "price": 3.14, "isValid": true}`

    valueStr := gjson.Get(jsonData, "value").String()
    valueNum := gjson.Get(jsonData, "value").Int()
    priceNum := gjson.Get(jsonData, "price").Float()
    isValid := gjson.Get(jsonData, "isValid").Bool()

    fmt.Printf("Value Str: %s\n", valueStr)
    fmt.Printf("Value Num: %d\n", valueNum)
    fmt.Printf("Price Num: %.2f\n", priceNum)
    fmt.Printf("Is Valid: %t\n", isValid)
}

输出结果:

Value Str: 42
Value Num: 42
Price Num: 3.14
Is Valid: true

示例2 - JSON数据迭代器

GJSON提供了一个迭代器函数gjson.ForEach可以遍历整个JSON结构。示例中", 我们需要深层遍历嵌套的数组和JSON对象。

{
  "result": [
    {
      "name": "Tom",
      "age": 30,
      "items": [
        {
          "id": 1,
          "name": "Book"
        },
        {
          "id": 2,
          "name": "Bike"
        }
      ]
    },
    {
      "name": "Jerry",
      "age": 20,
      "items": [
        {
          "id": 3,
          "name": "Computer"
        }
      ]
    }
  ]
}
package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonData := `{
  "result": [
    {
      "name": "Tom",
      "age": 30,
      "items": [
        {
          "id": 1,
          "name": "Book"
        },
        {
          "id": 2,
          "name": "Bike"
        }
      ]
    },
    {
      "name": "Jerry",
      "age": 20,
      "items": [
        {
          "id": 3,
          "name": "Computer"
        }
      ]
    }
  ]
}`

    gjson.Get(jsonData, "result").ForEach(func(key, value gjson.Result) bool {

        name := value.Get("name").String()
        age := value.Get("age").Int()

        fmt.Printf("Name: %s, age: %d\n", name, age)

        value.Get("items").ForEach(func(key, itemValue gjson.Result) bool {
            itemName := itemValue.Get("name").String()
            itemID := itemValue.Get("id").Int()

            fmt.Printf("    Item %s, id: %d\n", itemName, itemID)

            return true
        })

        return true
    })
}

输出结果:

Name: Tom, age: 30
    Item Book, id: 1
    Item Bike, id: 2
Name: Jerry, age: 20
    Item Computer, id: 3

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go 语言 json解析框架与 gjson 详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 如何修复Win11上的ntdll.dll崩溃错误? ntdll.dll崩溃问题解决办法

    如果你遇到了Win11上的ntdll.dll崩溃错误,可以根据以下步骤进行修复: 1. 重新启动电脑 首先,尝试重新启动电脑,因为某些系统问题可以通过重新启动来解决。如果重新启动后,错误仍然存在,请继续下一步操作。 2. 更新系统和驱动程序 从开始菜单中打开设置,并点击“更新和安全”选项。在右侧窗口中,点击“Windows 更新”并查找可用更新。如果有更新,…

    C 2023年5月23日
    00
  • C语言实现单词小帮手

    C语言实现单词小帮手攻略 介绍 单词小帮手是一个简单的命令行工具,可以将输入的英文单词翻译为中文,并给出其中文释义、发音、例句等信息。本攻略将会详细讲解如何使用C语言实现单词小帮手。 步骤 1. 数据获取 单词小帮手需要获取两种数据:英文单词和其翻译信息。我们可以通过以下方法获取这些数据: 使用爬虫抓取在线词典的数据 从一个本地的词库文件中读取数据 在有网络…

    C 2023年5月23日
    00
  • C++20 特性 协程 Coroutines(1)

    C++20 特性 协程 Coroutines(1)攻略 协程是C++20新增的一种编程语言特性,可用于异步编程,可以替代传统的回调、线程等异步编程方式,用于解决利用多核CPU或者异步I/O时出现的瓶颈,提高应用程序的性能。 协程的概述 协程是指一种在函数中使用的、可以在执行中暂停和继续的计算机程序组件。简单的说,协程就是可以在函数内通过暂停/恢复来提高程序性…

    C 2023年5月22日
    00
  • C语言 解压华为固件的实例代码

    下面我将详细讲解“C语言 解压华为固件的实例代码”的完整攻略。 1. 前置要求 在开始之前,我们需要先安装好以下工具: make gcc git wget 使用如下命令安装: sudo apt-get update sudo apt-get install -y make gcc git wget 2. 获取华为固件压缩包 首先,我们需要从华为的官方网站上获…

    C 2023年5月24日
    00
  • C语言中的BYTE和char深入解析

    C语言中的BYTE和char深入解析 什么是BYTE BYTE是C语言中一种数据类型,其定义和大小并不与标准C语言中定义的数据类型相同。BYTE通常被定义为占用一个字节(即8位)的无符号整数数据类型,其范围为0至255。BYTE主要用于底层编程,如嵌入式系统、驱动程序等。 可以用以下方式定义BYTE类型: typedef unsigned char BYTE…

    C 2023年5月23日
    00
  • 批处理 Set 命令详解 让你理解set命令

    批处理 Set 命令详解 什么是 Set 命令? Set 命令是 Windows CMD 中的命令之一,它用于设置环境变量,例如设置系统路径等。 Set 命令的语法 set [变量名=值] 变量名和值之间需要用等号 = 连接。 Set 命令的用法 1. 设置系统环境变量 使用 Set 命令可以设置系统环境变量,例如设置 PATH 变量: set PATH=C…

    C 2023年5月22日
    00
  • C 语言基础教程(我的C之旅开始了)[二]

    C 语言基础教程(我的C之旅开始了)[二]攻略 1. 基本数据类型 文章中提到了 C 语言的基本数据类型,包括了整型、浮点型、字符型和指针型。其中整型可以分为有符号和无符号两种,我们可以通过给数据类型指定修饰符来定义它是有符号还是无符号的。 此外,C 语言还有一个关键字 typedef,它可以为现有的数据类型创建一个新的别名。比如我们可以给 unsigned…

    C 2023年5月23日
    00
  • JS将网址url转化为JSON格式的方法

    将网址URL转换为JSON格式是一种常见的操作。下面是一些步骤,可帮助您使用JavaScript在JSON中使用网址: 创建URL对象。 使用JavaScript的URL对象,可以将网址转换为URL对象。例如,下面的代码将创建一个URL对象: const url = new URL(‘https://www.example.com/test/?id=123#…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部