文章介绍了在Go语言中解析JSON格式字符串的四种方法:json.Unmarshal、viper.ReadConfig、simplejson.NewJson和gojsonq.New().FromString,分别展示了它们的使用示例和特点,如Unmarshal需要预先定义结构体,viper提供键值对访问,simplejson和gojsonq提供了更灵活的查询方式。 摘要由CSDN通过智能技术生成

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

1. json.Unmarshal

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

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中读取数据并解析

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"))
 

程序运行后的结果如下:

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"进行下载

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安装

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
Go 语言自带的 encode/json 包提供了对 JSON 数据格式的编码和解码能力。
解析 JSON 的关键,其实在于如何声明存放解析数据的变量的类型。
此外使用 json 编码还会有几个需要注意的地方,谨防踩坑。
解析简单JSON
先观察下这段 JSON 数据的组成,name,created 是字符串。id 是整型,fruit 是一个字符串数组
    "name": "St...
JSON: JavaScript Object Notation(JavaScript 对象表示法)
JSON 是存储和交换文本信息的语法,类似 XML。
JSON 比 XML 更小、更快,更易解析JSON 独立于语言JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
简单来说,这结构储存数据有许多优点,我们喜欢使
				
Golang 中,可以使用反射来解析 JSON 数据。下面是一个简单的示例: 首先,你需要定义一个结构体,该结构体的字段与 JSON 数据的字段对应。例如,假设我们有以下的 JSON 数据: ```json "name": "John", "age": 30, "email": "john@example.com" 那么,你可以定义一个名为 `Person` 的结构体: ```go type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` 接下来,你可以使用 `encoding/json` 包来解析 JSON 数据。示例代码如下: ```go import ( "encoding/json" "fmt" func main() { jsonData := []byte(`{ "name": "John", "age": 30, "email": "john@example.com" var person Person err := json.Unmarshal(jsonData, &person) if err != nil { fmt.Println("解析 JSON 失败:", err) return fmt.Println("Name:", person.Name) fmt.Println("Age:", person.Age) fmt.Println("Email:", person.Email) 在上述代码中,我们使用 `json.Unmarshal` 函数将 JSON 数据解析为 `Person` 结构体对象。然后,我们可以通过访问结构体的字段来获取解析后的数据。 请注意,结构体字段的标签 `json:"fieldName"` 是用于指定 JSON 数据中对应的字段名。这样,在解析 JSON 数据时,Golang 就会自动将 JSON 数据中的字段值赋给结构体的相应字段。 希望这个示例能够帮助你理解如何使用反射解析 JSON 数据。如果你有任何进一步的问题,请随时提问。