GO中Json解析的几种方式

 更新时间:2024年01月12日 10:40:17   作者:fbbqt  
本文主要介绍了GO中Json解析的几种方式,详细的介绍了几种方法, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一个json字串,想要拿到其中的数据,就需要解析出来

一、适用于json数据的结构已知的情况下

使用json.Unmarshaljson数据解析到结构体中

根据json字串数据的格式定义struct,用来保存解码后的值。这里首先定义了一个与要解析的数据结构一样的结构体,然后通过json.Unmarshal进行解码,如果json数据很复杂,自定义的struct就跟着复杂。

package main

import (
	"encoding/json"
	"fmt"
)

var jsonstr = `{"province":{"value":"110000",
							"label":"北京市"},
				"city":{"value":"110100",
						"label":"北京城区"},
				"district":{"value":"110115",
							"label":"大兴区"}
				}`

type JsonData struct {
	Province JsonData2 `json:"province"`
	City     JsonData2 `json:"city"`
	District JsonData2 `json:"district"`
}

type JsonData2 struct {
	Value string `json:"value"`
	Label string `json:"label"`
}

// json解码
func JsonDecode() {
	//json解码
	jsondata := JsonData{}
	_ = json.Unmarshal([]byte(jsonstr), &jsondata)
	fmt.Println(jsondata.Province.Label)
	fmt.Println(jsondata.City.Label)
	fmt.Println(jsondata.District.Label)
}

二、适用于json数据的结构未知的情况下

1、使用map

package main

import (
	"encoding/json"
	"fmt"
)

var jsonStr = `{
	    "name": "A",
	    "sex": "男",
	    "address": [
		    { "province": "河南省", "city": "郑州市", "district": "金水区", "detail": "XX街道" },
		    { "province": "河南省", "city": "安阳市",  "district": "北关区", "detail": "YY街道" }
	    ]
}
`
func main() {
	var user map[string]interface{}
	err := json.Unmarshal([]byte(jsonStr), &user)
	if err != nil {
		panic("解析失败")
	}
	fmt.Printf("名字:%s\n", user["name"].(string))
	fmt.Printf("性别:%s\n", user["sex"].(string))

	for i, address := range user["address"].([]interface{}) {
		addr := address.(map[string]interface{})
		fmt.Printf("地址%d:%s,%s,%s %s\n", i, addr["province"].(string), addr["city"].(string), addr["district"].(string), addr["detail"].(string))
	}
}

2、使用三方包

1、github.com/bitly/go-simplejson

package main
 
import (
	"fmt"
	"github.com/bitly/go-simplejson"
)
 
var jsonStr := `{
	              "name": "A",
	              "sex": "男",
	              "address": [
		              { "province": "河南省", "city": "郑州市", "district": "金水区", "detail": "XX街道" },
		              { "province": "河南省", "city": "安阳市",  "district": "北关区", "detail": "YY街道" }
	              ]
                }`

func main() {
    // github.com/bitly/go-simplejson
	jst, err := simplejson.NewJson(jsonStr)
	if err != nil {
		panic("解析失败")
	}

	name, _ := jst.Get("name").String()
	sex, _ := jst.Get("sex").String()
	fmt.Printf("名字:%s\n", name)
	fmt.Printf("性别:%s\n", sex)

	for i, v := range jst.Get("address").MustArray() {

		ads := v // v等同于jst.Get("address").GetIndex(i)
		province, _ := ads.Get("province").String()
		city, _ := ads.Get("city").String()
		district, _ := ads.Get("district").String()
		detail, _ := ads.Get("detail").String()
		fmt.Printf("地址%d:%s,%s,%s %s\n", i, province, city, district, detail)
	}
}

2、github.com/spf13/viper

1、要通过viper.SetConfigType("json")函数指定要解析数据的格式,否则即使viper.ReadConfig没有报错,解析后也没有返回结果

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

package main

import (
	"fmt"
	"strings"
	"github.com/spf13/viper"
)

var jsonstr= `{
		        "name": "tian",
		        "flag": false,
		        "address": {
		          "city": "北京",
		          "area": "中国"
		        }
	          }`
func main() {

	// 设置需要配置的数据类型为json
	viper.SetConfigType("json")
	// 读取数据到viper
	if err := viper.ReadConfig(strings.NewReader(jsonstr)); err != nil {
		fmt.Println(err)
	}
	fmt.Printf("数据的所有键值: %v\n", viper.AllKeys())
	fmt.Printf("解析后的数据:%v\n", viper.AllSettings())
	fmt.Printf("The name is %s and the area is %s\n", viper.Get("name"), viper.Get("address.area"))
}

3、github.com/thedevsaddam/gojsonq

使用Find查询name之后,调用了一次Reset()方法。因为gojsonq在调用Find方法时,内部会记录当前的点,下一个查询会从上次记录的点开始

package main

import (
	"fmt"
	"github.com/thedevsaddam/gojsonq/v2"
)

var jsonstr = `{
		        "name": "sam",
		        "flag": true,
		        "address": {
		            "city": "北京",
		            "area": "中国"
		        }
	          }`
func main() {
	jst:= gojsonq.New().FromString(jsonstr)
	namestr := jst.Find("name").(string)

	jst.Reset()
	citystr := jst.Find("address.city")
	fmt.Printf("The name is %s and the city is %v", namestr, citystr)
}

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

相关文章

  • Golang实现DFA算法对敏感词过滤功能

    Golang实现DFA算法对敏感词过滤功能

    DFA算法是确定性有限自动机,其特征是,有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,通俗的讲DFA算法就是把你要匹配的做成一颗字典树,然后对你输入的内容进行匹配的过程,本文将利用DFA算法实现敏感词过滤,需要的可以参考一下
    2023-10-10
  • Go语言中日志统一处理详解

    Go语言中日志统一处理详解

    在现代软件开发中,日志记录是一项至关重要的任务,它不仅帮助开发人员诊断问题,还有助于监控和维护应用程序,本文主要来和大家聊聊日志的统一处理,感兴趣的小伙伴可以了解下
    2024-01-01
  • Golang中slice删除元素的性能对比

    Golang中slice删除元素的性能对比

    go没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素,下面这篇文章主要给大家介绍了关于Golang中slice删除元素的性能对比,需要的朋友可以参考下
    2022-06-06
  • GoLang OS包以及File类型详细讲解

    GoLang OS包以及File类型详细讲解

    go中对文件和目录的操作主要集中在os包中,下面对go中用到的对文件和目录的操作,做一个总结笔记。在go中的文件和目录涉及到两种类型,一个是type File struct,另一个是type Fileinfo interface
    2023-03-03
  • Go语言网站使用异步编程和Goroutine提高Web的性能

    Go语言网站使用异步编程和Goroutine提高Web的性能

    作为一门现代化编程语言,Go语言提供了强大的异步编程能力,使得程序员可以以更高效的方式处理并发任务,在Go语言中,使用Goroutine在单个进程中实现多任务并行处理,以及如何使用协程池来进一步提高Web服务器的处理能力,
    2024-01-01
  • GoLang读取文件的10种方法实例

    GoLang读取文件的10种方法实例

    读取文件是所有编程语言中最常见的操作之一,下面这篇文章主要给大家介绍了关于GoLang读取文件的10种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • GO语言开发终端命令行小工具改进更新

    GO语言开发终端命令行小工具改进更新

    这篇文章主要为大家介绍了GO语言开发终端命令行小工具的改进更新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • golang分层测试之http接口测试入门教程

    golang分层测试之http接口测试入门教程

    这篇文章主要介绍了golang分层测试之http接口测试入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Go语言中websocket的使用demo分享

    Go语言中websocket的使用demo分享

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。这篇文章主要和大家分享了一个Go语言中websocket的使用demo,需要的可以参考一下
    2022-12-12
  • CentOS 32 bit安装golang 1.7的步骤详解

    CentOS 32 bit安装golang 1.7的步骤详解

    Go是Google开发的一种编译型,并发型,并具有垃圾回收功能的编程语言。在发布了6个rc版本之后,Go 1.7终于正式发布了。本文主要介绍了在CentOS 32 bit安装golang 1.7的步骤,文中给出了详细的步骤,相信对大家的学习和理解具有一定的参考借鉴价值,下面来一起看看吧。
    2016-12-12

最新评论