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日

相关文章

  • 详解C++11中的lambda匿名函数

    关于“详解C++11中的lambda匿名函数”的完整攻略,我将分以下几个方面展开: 一、什么是lambda表达式? lambda表达式是C++11标准中引入的新特性,它是一个匿名函数,可以在需要函数的地方直接定义函数并执行。 通常情况下,函数都需要在定义后才能被调用,而lambda表达式可以直接定义后立即执行。它非常方便,在一些场景下(如STL算法、函数式编…

    C 2023年5月23日
    00
  • 一文掌握C++ 智能指针全部用法

    一文掌握C++智能指针全部用法 什么是智能指针 在C++中,当我们使用new操作符分配内存时,需要手动回收内存。如果忘记回收内存,就会出现内存泄漏等问题。为了解决这个问题,C++11引入了智能指针(Smart Pointer)。 智能指针是一种类,用来在动态分配的对象生命周期结束时自动释放该对象。它是指向动态分配的内存的类对象,这个类对象中承担了释放内存的责…

    C 2023年5月22日
    00
  • c语言函数如何求两个数的最大值

    下面是标准的Markdown格式的完整攻略,介绍如何使用C语言函数求两个数的最大值。 C语言函数如何求两个数的最大值 在C语言中,我们可以使用if语句和ternary运算符来计算两个数的最大值,但是这种方式不够优雅和高效。相反,我们可以使用一个简单的函数来完成这个任务。下面是一个函数示例: int max(int num1, int num2) { if(n…

    C 2023年5月23日
    00
  • C语言用指针支持数据结构

    以下是关于“C语言用指针支持数据结构”的完整使用攻略。 什么是数据结构 数据结构是计算机存储、组织数据的方式。数据在计算机内部的存储形式可以是内存、硬盘等,而数据结构则指的是数据在计算机中的逻辑关系和布局。一些常用的数据结构包括数组、链表、栈、队列、二叉树等。在程序设计中,我们常常需要运用数据结构这些工具和算法来处理数据。 C语言指针与数据结构 C语言中的指…

    C 2023年5月9日
    00
  • C语言学好递归看这一篇就够了

    C语言学好递归看这一篇就够了 什么是递归 递归(Recursion)是指在函数定义中使用函数自身的方法,是一种常用的解决问题的方法,通过不断调用自身,将大问题分解为小问题解决,最终达到解决整个问题的目的。 递归的三要素 递归包含三个要素:- 递归出口- 递归调用- 递归返回 递归示例一:求斐波那契数列第n项 斐波那契数列是指每一项都等于它前面两项的和,第一项…

    C 2023年5月22日
    00
  • 荣耀畅玩8c如何双卡切换流量 荣耀畅玩8c双卡切换流量方法

    荣耀畅玩8c如何双卡切换流量 荣耀畅玩8c双卡切换流量方法 在使用荣耀畅玩8c手机时,如果你希望切换流量卡,可以通过以下方法进行设置。 1. 打开设置 首先,在手机主界面,点击“设置”图标进入设置界面。 2. 进入双卡设置 在设置界面中,找到“双卡和移动网络”选项,点击进入。 3. 切换流量卡 在双卡设置界面中,找到“流量使用情况”选项,点击进入。在“流量使…

    C 2023年5月23日
    00
  • 如何用C语言画一个“圣诞树”

    下面是如何用C语言画一个圣诞树的攻略: 步骤一:准备工作 新建一个C语言文件,例如“christmas_tree.c”; 导入所需的头文件; 示例代码: #include<stdio.h> #include<windows.h> 步骤二:绘制圣诞树的主体 定义圣诞树的高度和底部宽度,例如height和width; 循环绘制每一行的叶子…

    C 2023年5月23日
    00
  • 用C++实现队列的程序代码

    实现队列的程序代码主要涉及以下内容:数据结构、队列的操作、C++语法等。下面我们一步步来进行讲解。 数据结构 队列可以看成是一种特殊的线性表,它具有先进先出(FIFO)的特点,即先进队列的元素将先输出,后进队列的元素将后输出。 队列通常包含以下几个基本操作:入队、出队、判空和求队列长度等。入队就是将新元素插入到队列的末尾,出队就是将队头元素删除并返回,判空就…

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