golang解析json数据的4种方法总结

 更新时间:2023年06月16日 08:40:37   作者:田土豆  
在日常工作中每一名开发者,不管是前端还是后端,都经常使用 JSON,下面这篇文章主要给大家介绍了关于golang解析json数据的4种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

现在有一个json格式的字符串,应该怎么解析呢,这里总结了以下4种方法

1. json.Unmarshal

函数func json.Unmarshal(data []byte, v any) error就是用来解析json编码的data,然后将结果保存在指针v指向的值里

e.g.

package main

import (
	"encoding/json"
	"fmt"
)

type user struct {
	Name    string
	Married bool
	Address struct {
		City    string
		Country string
	}
}

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`
	user1Struct := &user{}
	json.Unmarshal([]byte(user1), user1Struct)
	fmt.Printf("解码后的结果为:%v", *user1Struct)
}
  • 首先根据json数据的格式定义struct,用来保存解码后的值。这里首先定义了一个user结构体,然后通过json.Unmarshal进行解码
  • 缺点很明显,如果json数据很复杂,自定义的struct就跟着复杂。

程序运行后的结果如下:

PS E:\goland-workspace\GolangLearning\Common\json数据处理\unmarshal> go run .\main.go
解码后的结果为:{tian false {beijing China}}

2. viper.ReadConfig

使用go get -u github.com/spf13/viper 进行下载

函数func viper.ReadConfig(in io.Reader) error用于从in中读取数据并解析

e.g.

package main

import (
	"fmt"
	"strings"

	"github.com/spf13/viper"
)

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`
	// 指定配置的类型为json
	viper.SetConfigType("json")
	// 读取数据
	if err := viper.ReadConfig(strings.NewReader(user1)); err != nil {
		fmt.Println(err)
	}
	fmt.Printf("数据的所有键值: %v\n", viper.AllKeys())
	fmt.Printf("解析后的数据:%v\n", viper.AllSettings())
	fmt.Printf("the type of \"married\" is %s\n", reflect.TypeOf(viper.Get("married")))
	fmt.Printf("The name is %s and the country is %s\n", viper.Get("name"), viper.Get("address.country"))
}

首先要通过viper.SetConfigType("json")指定要解析数据的格式,否则即使viper.ReadConfig返回值没有报错,也得不到解析后的结果。可以查看https://github.com/spf13/viper/issues/316

方法viper.Get(),viper.GetString(),viper.GetBool()等等可以方便获取键值,同时对于键值的类型也能很好的判断

程序运行后的结果如下:

PS E:\goland-workspace\GolangLearning\Common\json数据处理\viper> go run .\main.go
数据的所有键值: [address.city address.country name married]
解析后的数据:map[address:map[city:beijing country:China] married:false name:tian]
the type of "married" is bool
The name is tian and the country is China

3. simplejson.NewJson

使用go get -u "github.com/bitly/go-simplejson"进行下载

e.g.

package main

import (
	"fmt"

	"github.com/bitly/go-simplejson"
)

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`

	user1json, err := simplejson.NewJson([]byte(user1))
	if err != nil {
		fmt.Println(err)
	}
	name1, _ := user1json.Get("name").String()
	city1, _ := user1json.Get("address").Get("city").String()
	fmt.Printf("The name is %s and the city is %s", name1, city1)
}

程序运行后的结果如下:

PS E:\goland-workspace\GolangLearning\Common\json数据处理\simpleJson> go run .\main.go
The name is tian and the city is beijing

4. gojsonq.New().FromString()

使用go get -u github.com/thedevsaddam/gojsonq安装

e.g.

package main

import (
	"fmt"

	"github.com/thedevsaddam/gojsonq/v2"
)

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`

	user1json := gojsonq.New().FromString(user1)
	name1 := user1json.Find("name").(string)

	user1json.Reset()
	city1 := user1json.Find("address.city")
	fmt.Printf("The name is %s and the city is %v", name1, city1)
}

在第一次查询name之后,手动调用了一次Reset()方法。因为JSONQ对象在调用Find方法时,内部会记录当前的节点,下一个查询会从上次查找的节点开始

程序运行后的结果如下:

PS E:\goland-workspace\GolangLearning\Common\json数据处理\gojsonq> go run .\main.go
The name is tian and the city is beijing

总结

到此这篇关于golang解析json数据的4种方法的文章就介绍到这了,更多相关golang解析json数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO中的slice使用简介(源码分析slice)

    GO中的slice使用简介(源码分析slice)

    slice(切片)是go中常见和强大的类型,这篇文章不是slice使用简介,从源码角度来分析slice的实现,slice的一些迷惑的使用方式,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • Golang学习笔记(一):简介

    Golang学习笔记(一):简介

    这篇文章主要介绍了Golang学习笔记(一):简介,本文讲解了Go语言最主要的特性、安装、环境变量设置、整体目录结构、Helloworld、go命令、调试、编辑器设置等内容,需要的朋友可以参考下
    2015-05-05
  • Golang 处理浮点数遇到的精度问题(使用decimal)

    Golang 处理浮点数遇到的精度问题(使用decimal)

    本文主要介绍了Golang 处理浮点数遇到的精度问题,不使用decimal会出大问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Golang语言学习拿捏Go反射示例教程

    Golang语言学习拿捏Go反射示例教程

    这篇文章主要为大家介绍了Golang语言中Go反射示例的教程,教你拿捏Go反射,再也不用被Go反射折磨,有需要的朋友可以共同学习参考下
    2021-11-11
  • Golang 操作 Kafka 如何设置消息的失效时间

    Golang 操作 Kafka 如何设置消息的失效时间

    在使用 Golang 操作 Kafka 时,你可以使用 Sarama 库来设置消息的失效时间,这篇文章主要介绍了Golang操作Kafka设置消息的失效时间,需要的朋友可以参考下
    2023-06-06
  • Golang干货分享之利用AST实现AOP功能

    Golang干货分享之利用AST实现AOP功能

    本文主要是一个纯干货分享,主要介绍了Golang如何利用AST实现AOP功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • Golang中函数的使用方法详解

    Golang中函数的使用方法详解

    这篇文章主要详细介绍了Golang中函数的使用方法,文中有详细的示例代码,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • 浅析Go语言bitset的实现原理

    浅析Go语言bitset的实现原理

    bitset包是一个将非负整数映射到布尔值的位的集合,这篇文章主要通过开源包bitset来为大家分析一下位集合的设计和实现,感兴趣的可以学习一下
    2023-08-08
  • Golang限流库与漏桶和令牌桶的使用介绍

    Golang限流库与漏桶和令牌桶的使用介绍

    这篇文章主要介绍了golang限流库以及漏桶与令牌桶的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 从错误中学习改正Go语言六个坏习惯提高编程技巧

    从错误中学习改正Go语言六个坏习惯提高编程技巧

    这篇文章主要为大家介绍了从错误中学习改正Go语言五个坏习惯提高编程技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论