编程笔记 Golang基础 028 结构体与JSON

编程笔记 Golang基础 028 结构体与JSON

  • 一、JSON
  • 二、结构体转JSON(序列化)
  • 三、JSON转结构体(反序列化)
  • 小结

结构体与JSON之间的相互转换是现代软件开发中数据处理的基础工具,极大地简化了数据在不同层次、不同组件间的流动与共享。

一、JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,但独立于语言,广泛应用于Web服务和应用程序之间进行数据传输。JSON的设计易于人类阅读和编写,并且易于机器解析和生成。

JSON的基本结构包括两种数据类型:对象(在大多数其他语言中对应字典或哈希表)和数组(对应列表或序列)。一个JSON对象由键值对组成,键是字符串,值可以是数字、字符串、布尔值、数组、另一个JSON对象,或者null。JSON数组则是有序的值集合,其元素可以包含上述任何类型的数据。

示例:

{"name": "John","age": 30,"isStudent": true,"favorites": ["apple", "banana"],"address": {"street": "123 Main St.","city": "New York"}
}

在这个例子中,我们有一个顶级JSON对象,它包含五个属性:

  • name 是一个字符串。
  • age 是一个数字。
  • isStudent 是一个布尔值。
  • favorites 是一个包含两个字符串元素的数组。
  • address 是另一个嵌套的JSON对象,其中包含了街道名和城市名。

JSON具有以下特性:

  1. 简洁 - JSON数据格式非常紧凑,便于网络传输。
  2. 层级清晰 - 数据以层次化的方式组织,便于理解与访问。
  3. 跨平台支持 - 大多数现代编程语言都提供了原生或第三方库来处理JSON数据。
  4. 自描述性 - JSON文档通常能够自我解释其内容结构。

由于这些优点,JSON被广泛应用在API接口设计、配置文件存储、前端与后端数据交互等多种场景中。

在Go语言中,encoding/json包提供了将结构体与JSON格式数据进行互相转换的功能。以下是如何进行结构体与JSON之间序列化(结构体转JSON)和反序列化(JSON转结构体)的示例:

二、结构体转JSON(序列化)

package mainimport ("encoding/json""fmt"
)// 定义一个结构体类型
type Person struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {// 创建Person结构体实例person := Person{Name: "Alice", Age: 30}// 序列化为JSON字符串personJSON, err := json.Marshal(person)if err != nil {panic(err) // 处理错误}fmt.Println(string(personJSON)) // 输出:{"name":"Alice","age":30}
}

三、JSON转结构体(反序列化)

package mainimport ("encoding/json""fmt"
)type Person struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {// JSON字符串jsonString := `{"name": "Bob", "age": 40}`// 反序列化为Person结构体实例var person Personerr := json.Unmarshal([]byte(jsonString), &person)if err != nil {panic(err) // 处理错误}fmt.Printf("Person: %+v\n", person) // 输出:Person: {Name:Alice Age:40}
}

注意事项:

  • 结构体字段标签(如json:"name")用于指定序列化时字段对应的JSON键名。
  • 结构体中的私有字段(首字母小写的字段)不会被自动序列化或反序列化。
  • 如果JSON数据中有额外的键值对,而结构体中没有对应的字段,这些额外的数据在反序列化过程中会被忽略。
  • 反序列化时,JSON数据的键必须能够映射到结构体中具有相应标签的字段,否则可能会导致解析失败。

小结

结构体与JSON之间的相互转换是现代软件开发中数据处理的基础工具,极大地简化了数据在不同层次、不同组件间的流动与共享。

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

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

相关文章

spring boot 集成科大讯飞星火认知大模型

一、安装依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

Educational Codeforces Round 160 (Rated for Div. 2) D. Array Collapse(笛卡尔树+DP)

原题链接&#xff1a;D. Array Collapse 题目大意&#xff1a; 给你一个长度为 n n n 的排列 p p p &#xff0c;排列的定义为 [ 1 , 2 , 3 , . . , n ] [1,2,3,..,n] [1,2,3,..,n] 中每个数都出现 恰好 一次。 你可以做 任意多次 这样的操作&#xff1a; 选出一个任意长度…

前端导出EXCEL

步骤解析 定义了一个名为 excelDown 的函数&#xff0c;它接受两个参数&#xff1a;res 和 type。res 是包含响应数据的对象&#xff0c;type 是要导出的文件类型。如果 type 未提供&#xff0c;则默认使用 Excel 文件的 MIME 类型。 export const excelDown (res, type) >…

unity导航网格无法烘培到台阶和斜坡

如图是我在b站学Unity导航网格时建的一个示例场景&#xff0c;本场景使用的为棱长1m的立方体&#xff0c;读者可以以此为参照度量其他物体大小。 可见导航网格根本无法烘焙到斜坡和台阶上&#xff0c;为解决问题我做了不少尝试&#xff0c;调整最大坡度和步高都没办法解决问题…

AI新纪元:可能的盈利之道

本文来源于Twitter大神宝玉&#xff08;dotey&#xff09;在聊 Sora 的时候&#xff0c;总结了 Sora 的价值和可能的盈利方向&#xff0c;我把这部分内容单独摘出来再整理一下。现在的生成式 AI 大家应该不陌生&#xff0c;用它总结文章、翻译、写作、画图&#xff0c;当然真正…

搭建私有Git服务器:GitLab部署详解

引言&#xff1a; 为了方便团队协作和代码管理&#xff0c;许多组织选择搭建自己的私有Git服务器。GitLab是一个集成了Git版本控制、项目管理、代码审查等功能的开源平台&#xff0c;是搭建私有Git服务器的理想选择。 目录 引言&#xff1a; 一、准备工作 在开始部署GitLab之…

Dockerfile和jar包不同目录处理

如果Dockerfile的全路径为/srm/myDockerfile/Dockerfile&#xff0c;而JAR文件位于/srm目录下&#xff0c;你可以在Dockerfile中使用相对路径引用JAR文件。以下是如何编写Dockerfile的示例&#xff1a; 假设你的项目结构如下&#xff1a; luaCopy code /srm |-- myDockerfile …

Map集合的遍历方式

遍历Map集合的几种方式 迭代器(Iterator)forlambdaStream 代码示例 package com.haimeng.Array;import java.security.Key; import java.util.HashMap; import java.util.Iterator; import java.util.Map;public class Lambda1 {public static void main(String[] args) {//…

MySQL数据库基础(十五):PyMySQL使用介绍

文章目录 PyMySQL使用介绍 一、为什么要学习PyMySQL 二、安装PyMySQL模块 三、PyMySQL的使用 1、导入 pymysql 包 2、创建连接对象 3、获取游标对象 4、pymysql完成数据的查询操作 5、pymysql完成对数据的增删改 PyMySQL使用介绍 提前安装MySQL数据库&#xff08;可以…

shell脚本介绍及基本功能

目录 1. 什么是shell 2. hello word 2.1 echo 2.2 第一个脚本 3. Bash的基本功能 3.1别名 3.2 常用快捷键 3.3 输入输出 3.4 输出重定向 3.5 多命令执行 3.6 管道符 3.7 通配符和特殊符号 1. 什么是shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用…

数据分析---常见处理逻辑

目录 数据清洗数据转换数据聚合数据筛选增删改查(以查为例)数据清洗 去除重复值:使用DISTINCT关键字去除重复行。//这将返回一个包含所有不重复城市的结果集 SELECT DISTINCT city FROM students;处理缺失值:使用IS NULL或IS NOT NULL判断是否为空值,并使用COALESCE或CASE…

STM32--低功耗模式详解

一、PWR简介 正常模式与睡眠模式耗电是mA级&#xff0c;停机模式与待机模式是uA级。 二、电源框图 供电区域有三处&#xff0c;分别是模拟部分供电&#xff08;VDDA&#xff09;&#xff0c;数字部分供电&#xff0c;包括VDD供电区域和1.8V供电区域&#xff0c;后备供电&…

mysql和redis双写一致性策略分析

mysql和redis双写一致性策略分析 一.什么是双写一致性 当我们更新了mysql中的数据后也可以同时保证redis中的数据同步更新&#xff1b; 数据读取的流程&#xff1a; 1.读取redis,如果value!null,直接返回&#xff1b; 2.如果redis中valuenull&#xff0c;读取mysql中数据对应的…

【程序员养生延寿系列-万人关注的养生指南】

一.程序员面临的健康问题 应该说不只程序员&#xff0c;大部分互联网从业者&#xff0c;都会遇到很多类似的健康问题&#xff0c;比如&#xff1a; 心理压力大&#xff0c;失眠长期加班久坐不动熬夜&#xff0c;甚至通宵作息不规律饮食不均衡 短期可能不会表现出来&#xff…

MMDetection3D v1.1.0安装教程

MMDetection3D v1.1.0安装 1. 系统环境2. 安装2.1 基本环境安装2.2 验证2.3 安装MinkowskiEngine和TorchSparse 3. 最终环境配置 根据 v1.1.0版本官方手册&#xff0c;测试后的安装配置&#xff0c;亲测可行 1. 系统环境 项目版本日期Ubuntu18.04.06 LTS-显卡RTX 2070-显卡驱…

Leaflet-学习

一、官网 英文官网&#xff1a;Leaflet 中文官网&#xff1a;Leaflet 二、介绍 Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库。 它大小仅仅只有39 KB, 并且拥有绝大部分开发者所需要的所有地图特性。 Leaflet 简单、高效并且易用。 它可以高效的运行在桌…

uni-app原生api的promise化以解决异步等待问题分析

相信各位在进行uni-app开发的时候会遇到各种关于异步回调问题&#xff0c;例如要传code给后端以换取session_key&#xff0c;在这之前需要先调用 uni.login&#xff0c;所以执行的顺序是必须同步等待的。在写这篇文章之前对于整体的流程概念需要做一个梳理&#xff0c;以便能更…

SSMBUG之 url +

1. Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. 经查, 书写一切正常. 注意到此时yml文件的图标是一个红色的Y而不是绿色的spring , 推测没有正确加载. 重新创建项目, 所有东西拷贝一份便恢复正常…

猫头虎分享已解决Bug || AttributeError: ‘Sequential‘ object has no attribute ‘session‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

MySQL报错:sql_mode=only_full_group_by解决方法

Linux环境 ubuntu 22.04 MySQL是8.0.35版本 问题描述 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column auth_system.t_class_temp_config.id which is not functionally dependent on columns in GROUP BY clause; this is inco…