Go语言对json处理总结

news2024/12/24 22:17:12

实际业务开发中,json处理很常见,本文总结一下go语言对json的处理。

目录

1.encoding/json 包

1.1 Marshal 函数

(1)原始字段名

(2)字段重命名

1.2 Unmarshal函数

(1)原始字段名

(2)字段重命名

2.常规方法处理嵌套json

3.github.com/tidwall/gjson处理嵌套json


1.encoding/json 包

1.1 Marshal 函数

Marshal将Go语言中的数据类型转换为JSON格式的数据。

(1)原始字段名

package main

import (
	"encoding/json"

	"fmt"
)

type UserInfo struct {
	Id   int
	Age  int
	Name string
	Addr string
}

// struct -> json string
func struct_to_jsonstring() {
	user := UserInfo{Name: "张三", Age: 18, Addr: "北京", Id: 110}

	b, err := json.Marshal(user)

	if err != nil {

		fmt.Println("转换失败", err)

		return

	}

	fmt.Println(string(b))
}

func main() {
	fmt.Println("========  struct -> json string  =======")
	struct_to_jsonstring()
}

运行结果:


(2)字段重命名

package main

import (
	"encoding/json"

	"fmt"
)

// 重命名
type UserInfo struct {
	Id   int    `json:"id_other"`
	Age  int    `json:"age_other"`
	Name string `json:"name_other"`
	Addr string `json:"addr_other"`
}

// struct -> json string
func struct_to_jsonstring() {
	user := UserInfo{Name: "张三", Age: 18, Addr: "北京", Id: 110}

	b, err := json.Marshal(user)

	if err != nil {

		fmt.Println("转换失败", err)

		return

	}

	fmt.Println(string(b))
}

func main() {
	fmt.Println("========  struct -> json string  =======")
	struct_to_jsonstring()
}

运行结果如下:

1.2 Unmarshal函数

Unmarshal将 JSON格式的数据转换为 Go 语言中的数据类型。

(1)原始字段名

package main

import (
	"encoding/json"

	"fmt"
)

type UserInfo struct {
	Id   int
	Age  int
	Name string
	Addr string
}

// json string -> struct
func jsonstring_to_struct() {
	s := `{"Id": 110,"Age": 18,"Name": "张三","Addr": "北京"}`

	var user UserInfo

	err := json.Unmarshal([]byte(s), &user)

	if err != nil {

		fmt.Println("转换失败", err)

		return

	}

	fmt.Println(user)
	fmt.Println(user.Id, user.Name, user.Age, user.Addr)
}
func main() {
	fmt.Println("========  json string -> struct  =======")
	jsonstring_to_struct()
}

运行结果如下:

(2)字段重命名

package main

import (
	"encoding/json"

	"fmt"
)

// 重命名
type UserInfo struct {
	Id   int    `json:"id_other"`
	Age  int    `json:"age_other"`
	Name string `json:"name_other"`
	Addr string `json:"addr_other"`
}

// json string -> struct
func jsonstring_to_struct() {
	s := `{"id_other": 220, "age_other": 16, "name_other": "李四", "addr_other": "上海"}`

	var user UserInfo

	err := json.Unmarshal([]byte(s), &user)

	if err != nil {

		fmt.Println("转换失败", err)

		return

	}

	fmt.Println(user)
	fmt.Println(user.Id, user.Name, user.Age, user.Addr)
}

func main() {
	fmt.Println("========  json string -> struct  =======")
	jsonstring_to_struct()
}

运行结果如下:

2.常规方法处理嵌套json


以下将演示从文件读取json然后进行反序列化,通过反序列化后的对象来读取各个字段的值。

result.json

{
    "title": "信号准入检查结果",
    "time": "202230712123456789",
    "author":{
        "name":"張三",
        "age":18
     },
    "body":[
        {
            "group_item": "定位类",
            "detail_list": [
                {
                    "check_item": "信号中的所有项",
                    "check_list": [
                        {"priority": "P0", "type": "完整性检查", "check_desc": "具体描述1。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary1.txt"},
                        {"priority": "P0", "type": "连续性检查", "check_desc": "具体描述2。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary2.txt"}
                    ]
                },
                {
                    "check_item": "经纬度",
                    "check_list": [
                        {"priority": "P0", "type": "异常检测(跳变)", "check_desc": "具体描述3。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary3.txt"},
                        {"priority": "P0", "type": "异常检测(静止)", "check_desc": "具体描述4。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary4.txt"}
                    ]
                }
            ]
        },
        {
            "group_item": "感知类",
            "detail_list":[
                {
                    "check_item": "此类中所有必须项",
                    "check_list": [
                        {"priority": "P0", "type": "完整性检查", "check_desc": "具体描述5。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary5.txt"},
                        {"priority": "P0", "type": "连续性检查", "check_desc": "具体描述6。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary8.txt"}
                    ]
                },
                {
                    "check_item": "障碍物坐标信号『position』",
                    "check_list": [
                        {"priority": "P0", "type": "跳变异常", "check_desc": "具体描述7。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary7.txt"},
                        {"priority": "P0", "type": "超出路面异常", "check_desc": "具体描述8。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary8.txt"}
                    ]
                }
            ]
        }
    ]
    }
package main

import (
	"encoding/json"
	"io/ioutil"

	"fmt"
)

// 复杂结构体和json
type CheckResultInfo struct {
	Title  string     `json:"title"`
	Time   string     `json:"time"`
	Author AuthorInfo `json:"author"`
	Body   []BodyInfo `json:"body"`
}

type AuthorInfo struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

type BodyInfo struct {
	GroupItem  string       `json:"group_item"`
	DetailList []DetailInfo `json:"detail_list"`
}

type DetailInfo struct {
	CheckItem string      `json:"check_item"`
	CheckList []CheckInfo `json:"check_list"`
}

type CheckInfo struct {
	Priority         string `json:"priority"`
	Type             string `json:"type"`
	CheckDesc        string `json:"check_desc"`
	Result           string `json:"result"`
	ConclusionDetail string `json:"conclusion_detail"`
	DetailReason     string `json:"detail_reason"`
}

// 常規方法解析json字符串
func common_deal_nestjson() {
	path := "./result.json"
	f, _ := ioutil.ReadFile(path)
	var result CheckResultInfo
	json.Unmarshal(f, &result)

	for _, iv := range result.Body {
		fmt.Println(iv.GroupItem)
		for _, nv := range iv.DetailList {
			fmt.Println(nv.CheckItem)
			for _, cv := range nv.CheckList {
				fmt.Println(cv.Priority,
					cv.Type,
					cv.CheckDesc,
					cv.Result,
					cv.ConclusionDetail,
					cv.DetailReason)
			}
		}
	}
}

func main() {
	fmt.Println("========  common deal nestjson  =======")
	common_deal_nestjson()
}

运行结果如下所示:

如下演示复杂json字符串转map用法,具体如下:

package main

import (
	"encoding/json"
	"log"

	"fmt"
)

// nestjson string -> map
func nestjsonstring_to_map() {
	jsonStr := `
    {
		"name": "hello tree",
		"occupation": "程序员",
		"info": {
			"age": 18,
			"addr": "广州"
		},
        "work_experience":[
           {
              "company1": "1234"
           },
           {
              "company2": "5678"
           }
        ]
     }`

	// 序列化成map
	anyMap := make(map[string]interface{}, 0)
	if err := json.Unmarshal([]byte(jsonStr), &anyMap); err != nil {
		panic(err)
	}
	log.Println("map result:", anyMap)
	fmt.Println(anyMap["name"], anyMap["occupation"], (anyMap["info"]), anyMap["work_experience"])
}

func main() {

	fmt.Println("========  nestjson string -> map  =======")
	nestjsonstring_to_map()
}

运行方法如下:

  

3.github.com/tidwall/gjson处理嵌套json


gjson不是标准库的包,需要使用go get github.com/tidwall/gjson安装。 
gjson处理json字符串,不需要反序列化为对象二直接读取json字符串各个字段的值。

package main

import (
	"encoding/json"
	"log"

	"fmt"

	"github.com/tidwall/gjson"
)

// 复杂结构体和json
type CheckResultInfo struct {
	Title  string     `json:"title"`
	Time   string     `json:"time"`
	Author AuthorInfo `json:"author"`
	Body   []BodyInfo `json:"body"`
}

type AuthorInfo struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

type BodyInfo struct {
	GroupItem  string       `json:"group_item"`
	DetailList []DetailInfo `json:"detail_list"`
}

type DetailInfo struct {
	CheckItem string      `json:"check_item"`
	CheckList []CheckInfo `json:"check_list"`
}

type CheckInfo struct {
	Priority         string `json:"priority"`
	Type             string `json:"type"`
	CheckDesc        string `json:"check_desc"`
	Result           string `json:"result"`
	ConclusionDetail string `json:"conclusion_detail"`
	DetailReason     string `json:"detail_reason"`
}

var jsonStr = `
	{
		"title": "信号准入检查结果",
		"time": "202230712123456789",
		"author":{
			"name":"張三",
			"age":18
		 },
		"body":[
			{
				"group_item": "定位类",
				"detail_list": [
					{
						"check_item": "信号中的所有项",
						"check_list": [
							{"priority": "P0", "type": "完整性检查", "check_desc": "具体描述1。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary1.txt"},
							{"priority": "P0", "type": "连续性检查", "check_desc": "具体描述2。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary2.txt"}
						]
					},
					{
						"check_item": "经纬度",
						"check_list": [
							{"priority": "P0", "type": "异常检测(跳变)", "check_desc": "具体描述3。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary3.txt"},
							{"priority": "P0", "type": "异常检测(静止)", "check_desc": "具体描述4。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary4.txt"}
						]
					}
				]
			},
			{
				"group_item": "感知类",
				"detail_list":[
					{
						"check_item": "此类中所有必须项",
						"check_list": [
							{"priority": "P0", "type": "完整性检查", "check_desc": "具体描述5。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary5.txt"},
							{"priority": "P0", "type": "连续性检查", "check_desc": "具体描述6。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary8.txt"}
						]
					},
					{
						"check_item": "障碍物坐标信号『position』",
						"check_list": [
							{"priority": "P0", "type": "跳变异常", "check_desc": "具体描述7。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary7.txt"},
							{"priority": "P0", "type": "超出路面异常", "check_desc": "具体描述8。", "result": "通过", "conclusion_detail":"ok", "detail_reason": "/tmp/sianal/summary8.txt"}
						]
					}
				]
			}
		]
		}
	`

func gson_deal_nestjson() {
	// json字符串反序列化成map
	anyMap := make(map[string]interface{}, 0)
	if err := json.Unmarshal([]byte(jsonStr), &anyMap); err != nil {
		panic(err)
	}
	log.Println("Unmarshal to map:", anyMap)

	// json字符串反序列化成对象
	res := CheckResultInfo{}
	if err := json.Unmarshal([]byte(jsonStr), &res); err != nil {
		panic(err)
	}
	log.Println("Unmarshal to struct:", res)

	// 不反序列化,直接操作json字符串,只读取单个key,比較适合复杂的json字符串
	title := gjson.Get(jsonStr, "title")
	time := gjson.Get(jsonStr, "time")
	body := gjson.Get(jsonStr, "body")
	item1 := body.Array()[0]
	item1_name := item1.Get("group_item")
	detail_list := item1.Get("detail_list")
	detail_item := detail_list.Array()[0]
	check_item := detail_item.Get("check_item")
	log.Println("title, time, item1_name, check_item: ", title, time, item1_name, check_item)
	log.Println("author info: ", gjson.Get(jsonStr, "author.name"),
		gjson.Get(jsonStr, "author.age").Int())

	check_list := detail_item.Get("check_list")
	check_list_item := check_list.Array()[1]
	log.Println("priority, type, check_desc, result, conclusion_detail, detail_reason: ",
		check_list_item.Get("priority"),
		check_list_item.Get("type"),
		check_list_item.Get("check_desc"),
		check_list_item.Get("result"),
		check_list_item.Get("conclusion_detail"),
		check_list_item.Get("detail_reason"))
}

func main() {

	fmt.Println("========  gson deal nestjson  =======")
	gson_deal_nestjson()
}

运行结果如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK-日志服务【logstash-安装与使用】

目录 【1】安装logstash logstash input 插件的作用与使用方式 【2】input --> stdin插件:从标准输入读取数据,从标准输出中输出内容 【3】input -- > file插件:从文件中读取数据 【4】input -- > beat插件:从filebe…

目标检测学习

目录 1、目标定位 2、特征点检测 3、目标检测 4、滑动窗口的卷积实现 5、Bounding Box 预测(Bounding box predictions) 6、交并化 7、非极大值抑制 8、Anchor Boxes 9、YOLO算法 1、目标定位 2、特征点检测 如何检测特征点(以人的部…

基于linux下的高并发服务器开发(第一章)- 静态库的制作1.4

01 / 什么是库 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。库文件有两种…

如何选择适合外贸公司的企业邮箱?推荐哪些优质企业邮箱服务?

为外贸公司选择合适的企业邮箱是企业成功经营的关键。强大、安全、直观的企业邮箱能够满足不同平台上不同用户的需求,这是确保数据和消息与客户和合作伙伴准确沟通的关键。以下是外贸公司在选择企业邮箱时应考虑的一些规范: 1、安全 在考虑企业邮箱时,安…

如何下载centOS镜像

我们在操作虚拟机的时候都有一个选择镜像, 这里我们可以去对应的官网去下载即可,下面就是网址 Download (centos.org) 就会出现许多地址 我们只需要随便选一个地址即可(前提它能用), 到了下图即可点击下载,…

通信算法之179: 单载波频域均衡系统的帧结构2

一。帧结构 (2) (3)

问懵了....美团一面索命44问,过了就60W+

说在前面 在40岁老架构师尼恩的(50)读者社区中,经常有小伙伴,需要面试美团、京东、阿里、 百度、头条等大厂。 下面是一个小伙伴成功拿到通过了美团一次技术面试,最终,小伙伴通过后几面技术拷问、灵魂拷问…

欧姆龙CJ系列PLC以太网通讯处理器欧姆龙cp1h以太网模块

捷米特JM-ETH-CJ转以太网模块是一款经济型的以太网通讯处理器,是为满足日益增多的工厂设备信息化需求(设备网络监控和生产管理)而设计,用于欧姆龙CJ1/CJ2/CS1系列PLC的以太网数据采集,非常方便构建生产管理系统。 捷米…

Mybatis-plus生成代码

生成类 package com.lbdj.user.service;import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.lbdj.user.service.co…

K8s生产环境常见问题处理、答疑

文章目录 K8s 常见问题处理、答疑[1] calico一直处于未就绪状态[2] 删除dashboard 一直卡在delete[3] k8s-dashboard 修改tocken-ttl避免频繁输入tocken[4] kubectl 快捷指令[5] 解决UTC时间问题[6] kubectl命令自动补全[7] kubectl exec进入pod[8] 使用hostpath解决容器UTC时间…

轻松玩转Python正则表达式

引言 正则表达式是一种强大的文本匹配和处理工具,广泛应用于各种编程语言中。在Python中,我们可以使用内置的re模块来处理正则表达式。本文将带您从入门到精通,逐步介绍Python中的正则表达式用法,并提供实例演示。 1. 正则表达式…

电商兴起与电脑城衰退:利弊分析与展望

随着科技的飞速发展和互联网的普及,电子产品成为现代生活中不可或缺的一部分。在过去很长一段时间里,想要购买电子设备都逃不开一个叫“电脑城”的地方,那里鱼龙混杂良莠不齐,是令许多人记忆深刻分外难忘之处。然而,随…

U启动盘(NETBASE第十二课)

1.域环境组策略的应用规则 1)策略的继承 继承:默认下级容器继承上级容器的组策略配置Default Domain Policy禁止更改桌面背景运行-dsa.msc创建OU并命名为caiwu,在caiwu的OU中创建新用户xmxm用户在win10客户端主机登录,验证不能更…

MongoDB比Mysql快的原因,为什么 MongoDB 索引选择B-树,而 Mysql 索引选择B+树

一、B树和B树的区别 很明显,我们想向弄清楚原因就要知道B树和B树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。 1、B树 B树是一种自平衡的搜索树,形式很简单: 这就是一颗B-树。针对我们这个问题的最核心的特点如下&#…

软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况,在这过程中要展现出自信,对工作有激情,上进,好学) 面试官您好,我叫###,今年26岁,来自广东深圳,就读专业是电子商务,…

TypeScript算法题实战——剑指 Offer篇(4)

目录 一、礼物的最大价值1.1、题目描述1.2、题解 二、最长不含重复字符的子字符串2.1、题目描述2.2、题解 三、丑数3.1、题目描述3.2、题解 四、第一个只出现一次的字符4.1、题目描述4.2、题解 五、数组中的逆序对5.1、题目描述5.2、题解 六、两个链表的第一个公共节点6.1、题目…

任务型对话对话策略学习的强化学习方法

任务型对话(TOD)系统旨在帮助用户解决从天气咨询到计划安排的一系列问题。完成任务的途径有二。 其一是端到端途径:直接将当前对话内容与系统的自然语言反映相关联。此种方法多是采用序列到序列的模型,然后进行监督训练。 第二种是模组途径&#xff1a…

can 相关背题

1 CAN FD 和CAN的 区别: CAN-FD:一帧数据最长64字节。以理解成CAN协议的升级版,只升级了协议,物理层未改变。传输速率不同、数据长度不同、帧格式不同、ID长度不同。 1)速率不同: CAN:最大传…

机械臂的雅克比矩阵推导

1. 线速度和角速度的递推通式推导 p i p i − 1 R i − 1 r i − 1 , i i − 1 \mathbf{p}_{i}\mathbf{p}_{i-1}\mathbf{R}_{i-1} \mathbf{r}_{i-1, i}^{i-1} pi​pi−1​Ri−1​ri−1,ii−1​ p i − 1 \mathbf{p}_{i-1} pi−1​是 { i − 1 } \{i-1\} {i−1}坐标系的原点的…