Go的JSON转化

在Go语言中,处理JSON(JavaScript Object Notation)数据非常常见,特别是在与Web服务交互时。Go提供了内置的encoding/json包来支持JSON的序列化(将Go对象转换为JSON格式)和反序列化(将JSON格式的数据解析为Go对象)。

1. JSON的序列化和反序列化

1.1 序列化(结构体转换为JSON)

将Go结构体转换为JSON格式使用json.Marshal函数。

package main

import (
	"encoding/json"
	"fmt"
)

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

func main() {
	// 初始化结构体
	p := Person{Name: "Alice", Age: 30}

	// 将结构体转换为JSON
	jsonData, err := json.Marshal(p)
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}

	// 输出JSON数据
	fmt.Println(string(jsonData)) // {"name":"Alice","age":30}
}
1.2 反序列化(JSON转换为结构体)

将JSON数据转换为Go结构体使用json.Unmarshal函数。

package main

import (
	"encoding/json"
	"fmt"
)

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

func main() {
	// JSON数据
	jsonData := `{"name": "Bob", "age": 25}`

	// 反序列化JSON到结构体
	var p Person
	err := json.Unmarshal([]byte(jsonData), &p)
	if err != nil {
		fmt.Println("Error unmarshaling JSON:", err)
		return
	}

	// 输出结构体
	fmt.Println(p) // {Bob 25}
}

2. 处理map类型的JSON

JSON对象可以表示为Go的map类型,其中键是字符串,值可以是任意类型。对于动态的或不确定结构的数据,使用map[string]interface{}

2.1 将map转换为JSON
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// 使用map表示JSON数据
	data := map[string]interface{}{
		"name": "Charlie",
		"age":  28,
		"hobbies": []string{"Reading", "Cycling"},
	}

	// 将map转换为JSON
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}

	// 输出JSON数据
	fmt.Println(string(jsonData))
}
2.2 将JSON转换为map
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// JSON数据
	jsonData := `{"name": "Diana", "age": 35, "hobbies": ["Music", "Traveling"]}`

	// 创建一个空的map
	var data map[string]interface{}

	// 将JSON数据反序列化到map
	err := json.Unmarshal([]byte(jsonData), &data)
	if err != nil {
		fmt.Println("Error unmarshaling JSON:", err)
		return
	}

	// 输出map数据
	fmt.Println(data) // map[age:35 hobbies:[Music Traveling] name:Diana]
}

3. JSON标签(struct tags)

Go语言中的结构体字段可以使用标签(tags)来指定JSON中的字段名。常见的用法是为结构体字段添加json标签,以定义序列化时的字段名。

3.1 设置字段名
package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name    string `json:"name"`
	Age     int    `json:"age"`
	Address string `json:"address,omitempty"` // omitempty表示如果字段值为空则不序列化
}

func main() {
	p := Person{Name: "Eva", Age: 30}

	// 将结构体转为JSON
	jsonData, err := json.Marshal(p)
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}

	fmt.Println(string(jsonData)) // {"name":"Eva","age":30}
}
3.2 使用omitempty标签

omitempty标签使得字段在为空时不进行JSON序列化。对于指针类型、字符串、数组、切片和数字类型,当其值为零值时,omitempty会忽略该字段。

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name    string `json:"name"`
	Age     int    `json:"age"`
	Address string `json:"address,omitempty"`
}

func main() {
	p := Person{Name: "Grace", Age: 25}

	// 序列化为JSON
	jsonData, err := json.Marshal(p)
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}

	fmt.Println(string(jsonData)) // {"name":"Grace","age":25}
}

4. 格式化输出(美化JSON)

可以使用json.MarshalIndent将JSON格式化输出,使其更易读(带有缩进)。

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name    string `json:"name"`
	Age     int    `json:"age"`
	Address string `json:"address"`
}

func main() {
	p := Person{Name: "Hannah", Age: 28, Address: "London"}

	// 美化输出
	jsonData, err := json.MarshalIndent(p, "", "    ")
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}

	fmt.Println(string(jsonData))
}

输出:

{
    "name": "Hannah",
    "age": 28,
    "address": "London"
}

5. 处理JSON中的空值和类型不匹配

Go中的interface{}类型允许在JSON反序列化时处理不同类型的数据。需要小心处理类型不匹配的情况。

5.1 空字段的处理

对于空值或没有定义的字段,在反序列化时可以忽略,或者通过结构体标签设置为零值。

5.2 类型断言

如果反序列化后的数据类型是interface{},你需要使用类型断言来访问具体类型的值。

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// JSON数据
	jsonData := `{"name": "Ivy", "age": 33, "active": true}`

	var data map[string]interface{}
	err := json.Unmarshal([]byte(jsonData), &data)
	if err != nil {
		fmt.Println("Error unmarshaling JSON:", err)
		return
	}

	// 使用类型断言
	if age, ok := data["age"].(float64); ok {
		fmt.Println("Age:", age)
	} else {
		fmt.Println("Age is missing or not a number")
	}

	// 直接访问布尔类型
	if active, ok := data["active"].(bool); ok {
		fmt.Println("Active:", active)
	}
}

6. 将JSON字符串映射到数组或切片

Go支持将JSON数据映射到数组或切片中,适用于处理JSON数组。

示例:JSON数组到Go切片
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// JSON数组
	jsonData := `[
		{"name": "Jack", "age": 25},
		{"name": "Tom", "age": 28},
		{"name": "Alice", "age": 30}
	]`

	// 创建切片并解析JSON数据
	var people []map[string]interface{}
	err := json.Unmarshal([]byte(jsonData), &people)
	if err != nil {
		fmt.Println("Error unmarshaling JSON:", err)
		return
	}

	// 输出数据
	for _, person := range people {
		fmt.Println(person)
	}
}
  • 序列化:使用json.Marshal将Go对象转换为JSON。
  • 反序列化:使用json.Unmarshal将JSON数据解析为Go对象。
  • 标签:可以使用json标签指定字段名,并使用omitempty控制字段是否为空时不序列化。
  • 格式化:使用json.MarshalIndent生成格式化输出。
  • 空值和类型断言:通过interface{}和类型断言处理复杂的JSON数据。
  • 切片和数组:支持将JSON数组解析为Go切片。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《重学Java设计模式》之 工厂方法模式

《重学Java设计模式》之 建造者模式 《重学Java设计模式》之 原型模式 《重学Java设计模式》之 单例模式 模拟发奖多种商品 工程结构 奖品发放接口 package com.yys.mes.design.factory.store;public interface ICommodity {/*** Author Sherry* Date 14:20 2024/11/6**/voi…

微信小程序的汽车维修预约管理系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统功能简述 前台用于实现用户在页面上的各种操作,同时在个人中心显示各种操作所产生的记录:后…

Oh My Posh安装

nullSet up your terminalhttps://ohmyposh.dev/docs/installation/windows Git ee oh-my-posh: Windows上的oh-my-zsh,源地址 https://github.com/JanDeDobbeleer/oh-my-posh.git (gitee.com)https://gitee.com/efluent/oh-my-posh

unity 镜面 反射

URP 镜面 资源绑定 下载 namespace UnityEngine.Rendering.Universal { [ExecuteInEditMode]public class PlanarURP : MonoBehaviour{public bool VR false;public int ReflectionTexResolution 512;public float Offset 0.0f;[Range(0, 1)]public float Reflecti…

深度学习(十):伦理与社会影响的深度剖析(10/10)

深度学习:伦理与社会影响的深度剖析 一、深度学习的伦理挑战 (一)数据隐私之忧 深度学习模型的训练往往需要大量数据,而数据的收集过程可能会侵犯个人隐私。例如,据统计,面部识别技术在全球范围内每天会收…

网络安全从入门到精通(特别篇I):应急响应之APT事件处置流程

应急响应 应急响应之APT处置流程1.现场询问1.1 了解威胁事件表现1.2 了解威胁事件发现时间1.3 了解系统架构,如服务器类型、业务架构、网络拓扑等2 判断安全事件状态3 确认事件对象4 确定事件时间5 问题排查应急响应之APT处置流程 1.现场询问 1.1 了解威胁事件表现 1.C&…

美格智能5G车规级通信模组: 5G+C-V2X连接汽车通信未来十年

自2019年5G牌照发放开始,经过五年发展,我国5G在基础设施建设、用户规模、创新应用等方面均取得了显著成绩,5G网络建设也即将从基础的大范围覆盖向各产业融合的全场景应用转变。工业和信息化部数据显示,5G行业应用已融入76个国民经…

鸿蒙next打包流程

鸿蒙打包 下载团结引擎添加开源鸿蒙打包支持 团结引擎版本要和sdk版本相对应,图中最新版1.3.1团结引擎,需要sdk12,直接在模块里自动下载即可。 打包报错 在unity社区搜索到,是burst的问题,在package manager里将burst升级到1.8.18就打包成功了,不知道为啥。 团结引擎打包…

python实现RSA算法

目录 一、算法简介二、算法描述2.1 密钥产生2.2 加密过程2.3 解密过程2.4 证明解密正确性 三、相关算法3.1 欧几里得算法3.2 扩展欧几里得算法3.3 模重复平方算法3.4 Miller-Rabin 素性检测算法 四、算法实现五、演示效果 一、算法简介 RSA算法是一种非对称加密算法&#xff0c…

Android笔记(三十一):Deeplink失效问题

背景 通过deeplink启动应用之后,没关闭应用的情况下,再次使用deeplink会失效的问题,是系统bug导致的。此bug仅在某些设备(Nexus 5X)上重现,launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…

基于Multisim拔河比赛游戏+计分电路(含仿真和报告)

【全套资料.zip】拔河比赛游戏计分电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.拔河游戏机用9个发光二极管排成一行。 2.开机后只有中间一个点亮,以此作为拔河的中心…

A20红色革命文物征集管理系统

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

面向 TP 场景能力全面升级, OceanBase 4.2.5 LTS 版正式发布

去年的 OceanBase 年度发布会中,OceanBase 推出了一体化数据库的首个长期支持版——4.2.1 LTS。这一年来,已有数百位客户在真实的生产环境中对该版本进行了验证并成功上线,证明了OceanBase 在TP场景中的卓越性能。与此同时,越来越…

在线预览 Word 文档

引言 随着互联网技术的发展,Web 应用越来越复杂,用户对在线办公的需求也日益增加。在许多业务场景中,能够直接在浏览器中预览 Word 文档是一个非常实用的功能。这不仅可以提高用户体验,还能减少用户操作步骤,提升效率…

MongoDB笔记02-MongoDB基本常用命令

文章目录 一、前言二、数据库操作2.1 选择和创建数据库2.2 数据库的删除 3 集合操作3.1 集合的显式创建3.2 集合的隐式创建3.3 集合的删除 四、文档基本CRUD4.1 文档的插入4.1.1 单个文档插入4.1.2 批量插入 4.2 文档的基本查询4.2.1 查询所有4.2.2 投影查询(Projec…

对称二叉树(力扣101)

题目如下: 思路 对于这道题, 我会采用递归的解法. 看着对称的二叉树, 写下判断对称的条件, 再进入递归即可. 值得注意的是, 代码中会有两个函数, 第一个是isSymmetric,第二个是judge. 因为这里会考虑到一种特殊情况, 那就是 二叉树的根结点(最上面的那个),它会单独用…

基于SSM的社区物业管理系统+LW参考示例

1.项目介绍 系统角色:管理员、业主(普通用户)功能模块:管理员(用户管理、二手置换管理、报修管理、缴费管理、公告管理)、普通用户(登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…

【pycharm jupyter】远程开发 启动报错

报错信息 upyter server process exited with code 1 ServerApp] A _jupyter_server_extension_points function was not found in jupyter_lsp. Instead, a _jupyter_server_extension_paths function was found and will be used for now. This function name will be depre…

软件设计师-上午题-12、13 软件工程(11分)

软件工程题号一般为17-19和29-36题,分值一般为11分。 目录 1 软件过程 1.1 CMM(能力成熟度模型) 1.1.1 真题 1.2 CMMI(能力成熟度模型集成) 1.2.1 真题 2 软件过程模型 2.1 瀑布模型 2.2 V模型 2.2.1 真题 2.3 增量模型 2.3.1 真题 2.4 演化模型 2.5 …

基于springboot得高校评教教师工作量管理系统设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…