Go语言:json 作用和语法

news2025/5/14 0:12:41

在 Go 语言中,JSON 字段(也称为 JSON Tag)是附加在结构体字段上的元数据,用于控制该字段在 JSON 编码(序列化)和解码(反序列化) 时的行为。它的语法是:

type StructName struct {
    FieldName FieldType `json:"json_field_name,option1,option2,..."`
}

例如:

type User struct {
    Name string `json:"name"`           // 字段在 JSON 中显示为 "name"
    Age  int    `json:"age,omitempty"`  // 如果 Age 是零值,JSON 中会忽略它
}

JSON 字段的作用

指定 JSON 字段名

默认情况下,Go 结构体的字段名会直接作为 JSON 的键名(首字母大写转为小写)。但通过 json Tag,可以自定义 JSON 中的键名:

type Message struct {
    Sender string `json:"sender"`  // Go 字段 `Sender` → JSON 键 `"sender"`
}
  • 输入 Go 结构体
msg := Message{Sender: "Alice"}
  • 输出 JSON
{"sender": "Alice"}

忽略空值字段

如果字段是零值(如 0""nil),加上 omitempty 后,该字段不会出现在 JSON 中:

type User struct {
    Name string `json:"name,omitempty"`  // 如果 Name 是 "",JSON 中不会包含该字段
    Age  int    `json:"age,omitempty"`   // 如果 Age 是 0,JSON 中不会包含该字段
}
  • 输入 Go 结构体
user := User{Age: 0}
  • 输出 JSON
{}

忽略字段(-

如果某个字段不需要出现在 JSON 中,可以用 - 忽略它:

type Config struct {
    Password string `json:"-"`  // 该字段不会参与 JSON 序列化
}
  • 输入 Go 结构体
cfg := Config{Password: "123456"}
  • 输出 JSON
{}

encoding/json

在 go 中,encoding/json包下提供对应的函数来进行 json 的序列化与反序列化,主要使用的有如下函数。

func Marshal(v any) ([]byte, error) //将go对象序列化为json字符串

func Unmarshal(data []byte, v any) error //将json字符串反序列化为go对象

首先定义结构体

type Person struct {
   UserId   string
   Username string
   Age      int
   Address  string
}

序列化

func main() {
  person := Person{
    UserId:   "120",
    Username: "jack",
    Age:      18,
    Address:  "usa",
  }

  bytes, err := json.Marshal(person)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(bytes))
}

结果

{ "UserId": "120", "Username": "jack", "Age": 18, "Address": "usa" }

字段重命名

我们可以通过结构体标签来达到重命名的效果。

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

此时输出

{ "id": "1202", "name": "jack", "age": 19, "address": "USA" }

缩进

序列化时默认是没有任何缩进的,这是为了减少传输过程的空间损耗,但是这并不利于人为观察,在一些情况下我们需要将其序列化成人类能够观察的形式。为此,只需要换一个函数。

func main() {
   person := Person{
      UserId:   "1202",
      Username: "jack",
      Age:      19,
      Address:  "USA",
   }
   bytes, err := json.MarshalIndent(person, "", "\t")
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(string(bytes))
}

输出如下

{
  "id": "1202",
  "name": "jack",
  "age": 19,
  "address": "USA"
}

反序列化

在反序列化时需要注意,如果结构体有 json 标签的话,则字段名优先以 json 标签为准,否则以结构体属性名为准。

func main() {
  person := Person{}

  jsonStr := "{\"id\":\"120\",\"name\":\"jack\",\"age\":18,\"address\":\"usa\"}\n"

  err := json.Unmarshal([]byte(jsonStr), &person)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Printf("%+v", person)
}

输出

{UserId:120 Username:jack Age:18 Address:usa}

参考资料:

Golang 中文学习文档 标准库 encoding/json包

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

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

相关文章

【Qt】Qt 构建系统详解:qmake 入门到项目实战

Qt 构建系统详解:qmake 入门到项目实战 本文将系统介绍 Qt 构建工具 qmake 的用法,并通过一个完整的项目结构示例,帮助你掌握 .pro 文件编写、子项目管理、模块依赖等核心技能。 🧭 一、什么是 qmake? qmake 是 Qt 提…

《Zabbix Proxy分布式监控实战:从安装到配置全解析》

注意:实验所需的zabbix服务器的搭建可参考博客 zabbix 的docker安装_docker安装zabbix-CSDN博客 1.1 实验介绍 1.1.1 实验目的 本实验旨在搭建一个基于Zabbix的监控系统,通过安装和配置Zabbix Proxy、MySQL数据库以及Zabbix Agent,实现分…

华为配置篇-RSTP/MSTP实验

MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP(快速生成树协议)​ RSTP(Rapid Spanning Tree Protocol)是 STP 的改进版本,基于 ​​IEEE 802.1w 标准​​,核心目标是解决传统 STP 收敛速度慢的问…

git如何将本地 dev 分支与远程 dev 分支同步

要让本地 dev 分支与远程 dev 分支完全同步(丢弃本地多余的提交记录),可以按照以下步骤操作: 1. ​​获取远程最新状态​ git fetch origin dev # 拉取远程 dev 分支的最新提交,但不会修改本地代码 IDEA中点击fetc…

Unity基础学习(九)输入系统全解析:鼠标、键盘与轴控制

目录 一、Input类 1. 鼠标输入 2. 键盘输入 3. 默认轴输入 (1) 基础参数 (2)按键绑定参数 (3)输入响应参数 (4)输入类型与设备参数 (5)不同类型轴的参…

QT:获取软件界面窗口的尺寸大小2025.5.8

在Windows系统中,获取软件界面窗口的尺寸大小可以通过多种方法实现,以下是基于不同场景的详细解决方案: 方法1:使用Windows API获取窗口尺寸 适用于获取外部应用程序窗口的尺寸(如记事本、计算器等)。 步…

【ML-Agents】ML-Agents示例项目导入unity报错解决

最近在跑ML-Agents的示例代码,无奈往unity中导入项目后,就出现报错。本文简要描述了各个报错的解决方法。 文章目录 一、error CS0234: The type or namespace name InputSystem does not exist in the namespace UnityEngine (are you missing an assem…

Transformer Decoder-Only 参数量计算

Transformer 的 Decoder-Only 架构(如 GPT 系列模型)是当前大语言模型的主流架构,其参数量主要由以下几个部分组成: 嵌入层(Embedding Layer)自注意力层(Self-Attention Layers)前馈…

uni-app 中的条件编译与跨端兼容

uni-app 为了实现一套代码编译到多个平台(包括小程序,App,H5 等),引入了条件编译机制。 通过条件编译,我们可以针对不同的平台编写特定的代码,从而实现跨端兼容。 一、条件编译的作用 平台差异…

Unity接入SDK之修改Unity启动页面

原理就是在Android Studio新建Activity继承UnityPlayerActivity,然后再Unity中修改启动页面。 一,Android Studio篇 首先新建一个项目, 新建完成之后基于新建的项目新建一个module,选择为Android Library类型 新建的Library再目…

yarn workspace使用指南

作用 Yarn workspace 是 Yarn 包管理工具中的一个功能,主要用于管理多包项目(monorepo)。它的主要作用如下: 支持多包结构:允许在一个仓库中管理多个独立的包或项目。项目间依赖管理:方便地在不同包之间添…

VUE el-select下拉框动态设置禁用,删除后恢复可选择

场景:点击新增添加按钮,列表table会新增一条包含下拉菜单的数据,如果其中任何一个下拉框选择了某个值,那么新增的下拉菜单的选项中该值是禁用状态,只能选择其他未被选中过的值。点击删除按钮后,已禁用的选项…

FPGA----基于ALINX提供的debian实现TCF

引言:接上问,我们使用自制的image.ub和boot.bin以及ALINX提供的debian8根文件系统,构建了petalinux,但是经测试,该文件系统无法启用TCF服务,即无法与Xilinx SDK建立连接,那么我们应该如何解决? FPGA----基于ZYNQ 7020实现定制化的EPICS通信系统-CSDN博客文章浏览阅读4…

木马查杀篇—Opcode提取

【前言】 介绍Opcode的提取方法,并探讨多种机器学习算法在Webshell检测中的应用,理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode:计算机指令的一部分,也叫字节码,一个php文件可以抽取出…

国产化Excel处理控件Spire.XLS系列教程:如何通过 C# 删除 Excel 工作表中的筛选器

在 Excel 文件中,筛选器(Filter)是一个常用的数据处理工具,可以帮助用户快速按条件筛选数据行。但在数据整理完成、导出、共享或打印之前,往往需要 删除 Excel 工作表中的筛选器,移除列标题中的下拉筛选按钮…

[sklearn] 特征工程

一.字典数据抽取 def dictvec():"""字典数据抽取:return: None"""# 实例化# sparse改为True,输出的是每个不为零位置的坐标,稀疏矩阵可以节省存储空间dict DictVectorizer(sparseFalse) #矩阵中存在大量的0,sparse存储只…

CI/CD与DevOps流程流程简述(提供思路)

一 CI/CD流程详解:代码集成、测试与发布部署 引言 在软件开发的世界里,CI/CD(持续集成/持续交付)就像是一套精密的流水线,确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师,接下来…

S7-1500——零基础入门1、工业编程基本概念

工业编程基本概念 一,数制与基本数据类型二,数字量信号三,模拟量信号一,数制与基本数据类型 本节主要内容 类别内容主题数制与基本数据类型数制讲解十进制、十六进制、二进制及其进位规则;基数、位权概念数据类型介绍PLC 使用的数据类型:未序列数据类型(bit、byte、wor…

六、快速启动框架:SpringBoot3实战

六、快速启动框架:SpringBoot3实战 目录 一、SpringBoot3介绍 1.1 SpringBoot3简介1.2 系统要求1.3 快速入门1.4 入门总结 二、SpringBoot3配置文件 2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文件使用2.4 批量配置文件注入2.5 多环境配置和使用 三、…

万兴PDF-PDFelement v11.4.13.3417

万兴PDF专家(Wondershare PDFelement)是一款国产PDF文档全方位解决方案.万兴PDF编辑器软件万兴PDF中文版,专注于PDF的创建,编辑,转换,签名,压缩,合并,比较等功能.万兴PDF专业版PDF编辑软件,以简约风格及强大的功能在国外名声大噪,除了传统功能外,还提供OCR扫描,表格识别,创建笔…