20.1 JSON-JSON接口以及在Go语言中使用JSON

1. 简介

JSON即JavaScript对象表示法(JavaScript Object Notation),是一种用于存储和交换数据的格式,是一种可供人类阅读和理解的纯文本格式。

JSON既可以键值对的形式,也可以数组的形式,表示数据。

JSON最初是JavaScript的一个子集,但现在已然独立,为大多数语言所支持。

JSON已经取代XML,成为互联网上存储和交换数据的事实标准。

JSON以下面这种形式描述对象(一系列键值对组合):

  • {
  •         "name": "George",

        "age": 40,

        "children": ["Bea", "Fin"]

       }

2. JSON接口

近年来,互联网上出现了很多卓越的JSON格式的API (Application Programming Interface,应用编程接口)。

借助这些API,应用程序可以从作为数据交换平台的互联网上,获得海量的有关任何主题的数据。

API令应用开发者无须连接到数据库,就能请求并使用各种形式的数据资源。

  • 例如下面的JSON数据来自Dark Sky天气预报服务系统,通过json格式字符串描述了经纬度、时区、温度等内容。
    • {"latitude": 42.3601, "longitude": -71.0589, "timezone": "America/New_York",
    •  "currently": {"time": 1509993277, "summary": "Drizzle", "icon": "rain",
    •                      "nearestStormDistance": 0, "precipIntensity": 0.0089, ...},
    •  "minutely": {"summary": "Light rain stopping in 13 min., starting again 30 min. later.",
    •                      "icon": "rain", "data": [{...}, ...]},
    • "hourly": {"summary": ... }, ... }

 3. 在Go语言中使用JSON

Go语言标准库通过encoding/json包提供对JSON数据的编码和解码操作。

JSON编码,即将Go语言数据类型的变量转换为JSON格式的字符串

  • 定义结构体类型
    • type Person struct { ... },结构体的字段名对应json的“键”
  • 创建结构体变量
    • p := Person{ ... }
  • 将结构体变量编码为JSON格式的字节切片 
    • jb, err := json.Marshal(p)
  • 将JSON格式的字节切片转换JSON格式的字符串 
    • js := string(jb) 

// 创建结构体
// 结构体可将多个不同类型的数据组织在一起,是一种绝佳的数据封装形式
package main
import "fmt"

type person struct {
    name    string
    age     int 
    hobbies []string
}
func main() {
    p := person{
        name:    "George",
        age:     40,
        hobbies: []string{"Cycling", "Cheese", "Techno"},
    }
    fmt.Printf("%+v\n", p)
}
// 打印输出:
{name:George age:40 hobbies:[Cycling Cheese Techno]} 

 

// 将结构体编码为JSON字符串
//         json.Marshal                string
// 结构体 -------------> JSON字节切片 ------> JSON字符串
package main

import (
    "encoding/json"
    "fmt"
    "log"
)

// Person with name, age and hobbies
type Person struct {
    Name    string
    Age     int 
    Hobbies []string
}
func main() {
    p := Person{
        Name:    "George",
        Age:     40,
        Hobbies: []string{
            "Cycling", "Cheese", "Techno"},
    }

    fmt.Printf("%+v\n", p)

	jb, err := json.Marshal(p)	//将结构体变量编码为JSON格式的字节切片
    if err != nil {
        log.Fatal(err)
    }

    js := string(jb)	// 将json字节切片转换为json字符串
    fmt.Println(js)
}
// 打印输出:
{Name:George Age:40 Hobbies:[Cycling Cheese Techno]}
{"Name":"George","Age":40,"Hobbies":["Cycling","Cheese","Techno"]}

 

默认情况下,JSON字符串中的分别取自结构体中的字段名字段值(大小写敏感)。

  • type Person struct {
  •     Name    string
  •     Age     int
  •     Hobbies []string
  • }
  • {"Name":"George","Age":40,"Hobbies":["Cycling","Cheese","Techno"]}

如果为结构体字段指定了JSON标签,则以标签文本作为JSON字符串的键。

  • type Person struct {

  // 标签是以反引号包围的

    Name    string   `json:"name"`

    Age     int      `json:"age"`

    Hobbies []string `json:"hobbies"`

}

        {"name":"George","age":40,"hobbies":["Cycling","Cheese","Techno"]}

// 使用JSON标签
// 默认情况下,JSON字符串中的键和值分别取自结构体中的字段名和字段值,但
// 如果为结构体中的字段指定了JSON标签,则以标签文本作为JSON字符串的键
// 
// type 结构体 struct {
//     字段1 类型1 `json:"键1"` 
//     字段2 类型2 `json:"键2"` 
//     ... 
//     字段n 类型n `json:"键n"`
// }
package main

import (
    "encoding/json"
    "fmt"
    "log"
)
// Person with name, age and hobbies
type Person struct {
    Name    string   `json:"name"`
    Age     int      `json:"age"`
    Hobbies []string `json:"hobbies"`
}

func main() {
    p := Person{
        Name:    "George",
        Age:     40,
        Hobbies: []string{
            "Cycling", "Cheese", "Techno"},
    }
    fmt.Printf("%+v\n", p)
	jb, err := json.Marshal(p)
    if err != nil {
        log.Fatal(err)
    }

    js := string(jb)
    fmt.Println(js)
}
// 打印输出:
{Name:George Age:40 Hobbies:[Cycling Cheese Techno]}
{"name":"George","age":40,"hobbies":["Cycling","Cheese","Techno"]} 

默认情况下,结构体中的零值字段也会被编码到JSON字符串中。

  • type Person struct {
  •     Name    string   `json:"name"`
  •     Age     int      `json:"age"`
  •     Hobbies []string `json:"hobbies"`
  • }

p:= Person{} // 使用默认零值初始化

    • 通过json.Marshal(p)函数将结构体解析为json字符如下:

{"name":"","age":0,"hobbies":[]}

在JSON标签中使用"omitempty"关键字,令编码器在编码时忽略零值字段。

  • type Person struct {
  •     Name    string   `json:"name,omitempty"`
  •     Age     int      `json:"age,omitempty"`
  •     Hobbies []string `json:"hobbies,omitempty"`
  • }
  • {}

 

// 忽略空字段
// 默认情况下,结构体中的零值字段也会被编码到JSON字符串中,除非在其JSON
// 标签中使用了"omitempty"关键字,指示编码器在编码的过程中忽略零值字段
package main

import (
    "encoding/json"
    "fmt"
    "log"
)

// Person with name, age and hobbies
type Person struct {
    Name    string   `json:"name,omitempty"`
    Age     int      `json:"age,omitempty"`
    Hobbies []string `json:"hobbies,omitempty"`
}
func main() {
    p := Person{}
    fmt.Printf("%+v\n", p)

    jb, err := json.Marshal(p)
    if err != nil {
        log.Fatal(err)
    }

    js := string(jb)
    fmt.Println(js)
}
// 打印输出:
{Name: Age:0 Hobbies:[]}
{} 

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

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

相关文章

FPGA专项课程即将开课,颁发AMD官方证书

社区成立以来,一直致力于为广大工程师提供优质的技术培训和资源,得到了众多用户的喜爱与支持。为了满足用户需求,我们特别推出了“基于Vitis HLS的高层次综合及图像处理开发”课程。 本次课程旨在帮助企业工程师掌握前沿的FPGA技术&#xff…

【PIXEL】2024年 Pixel 解除 4G限制

首先在谷歌商店下载 Shizuku 和 pixel IMS 两个app 然后打开shizuku ,按照它的方法启动 推荐用adb 启动( 电脑连手机 ,使用Qtscrcpy最简洁) 一条指令解决 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.ap…

王炸! Suno史诗级更新,随便哼哼就能出一首好听的歌曲?

suno史诗级更新,随便哼哼就能出一首好听的歌曲? 就在今天,suno迎来史诗级更新! 先看截图! 来不及解释,我先试了一下,简直太牛了,先看看看效果,点开链接听歌! …

使用Spring Boot 3实现邮箱登录/注册接口开发

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

windows环境下配置git环境变量

路由当前目录 vim 打开 .bash_profile PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.4.3nts PATH$PATH:/d/phpstudy_pro/Extensions/php8/php8.2.9nts PATH$PATH:/d/phpstudy_pro/Extensions/composer2.5.8 …

进阶篇02——索引

概述 结构 B树索引 在这里推荐一个可以将个各种数据结构可视化的网站:数据结构可视化 哈希索引 相关的一个面试题 分类 聚集索引和二级索引(非聚集索引) 思考题:索引思考题 创建索引语法 如果一个索引关联多个字段&#xff…

链表题目之指定区间处理

前言 链表中有一些题目是需要知道并且记住对应的技巧的,有一些题目就是基本的链表技巧手动模拟推演注意细节等。 对于需要知道并且记住对应技巧的题目会有专门的一栏进行讲解,此类题目主要有:相交链表、环形链表、回文链表等,这些…

Adobe Photoshop cc快速抠图与精致抠图方法

一、背景 Photoshop cc绝对是最好用的抠图and修图软件,但是即使最简单的抠图,每次用时都忘记怎么做,然后再去B站搜,非常费时,下面记录一下抠图过程,方便查阅。 一、Adobe Photoshop快速抠图 选择——主体…

出现 Error creating bean with name xxx defined in class 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法4. Demo1. 问题所示 此类问题来自私信,本着探究问题的缘由,理性分析了下,让大家也学会分析Bug解决Bug 问题如下所示: Error creating bean with name xxx defined in class截图如下所示: 2. 原理分析 通用的原理进行分析 出现…

基于STM32和人工智能的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现:实现智能家居监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景:智能家居环境监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发展&…

Chrome/Edge浏览器视频画中画可拉动进度条插件

目录 前言 一、Separate Window 忽略插件安装,直接使用 注意事项 插件缺点 1 .无置顶功能 2.保留原网页,但会刷新原网页 3.窗口不够美观 二、弹幕画中画播放器 三、失败的尝试 三、Potplayer播放器 总结 前言 平时看一些视频的时候&#xff…

java实现文件的压缩及解压

一、起因 开发中需要实现文件的压缩及解压功能,以满足某些特定场景的下的需要,在此说下具体实现。 二、实现 1.定义一个工具类ZipUtils,实现文件的压缩及解压,代码如下: import java.io.*; import java.nio.charset.Charset; impo…

动手学操作系统(六、获取物理内存容量)

动手学操作系统(六、获取物理内存容量) 在上一节中,我们介绍了保护模式和实模式的区别,保护模式的最大特点是“大”,“大”是指寻址空间大,在进入保护模式之后,我们还将要接触虚拟内存、内存管…

迅狐跨境商城系统|全平台兼容|前端采用uni-app跨端框架,后端采用ThinkPHP5框架

高效实现全平台兼容的迅狐跨境商城系统 迅狐跨境商城系统是一款专为跨境电商企业设计的全平台兼容系统。其前端采用uni-app跨端框架,后端采用ThinkPHP5框架,旨在实现高效的开发和运营管理。 1. 全平台兼容的前端设计 迅狐跨境商城系统的前端采用uni-a…

C# WinForm —— 34 ToolStrip 工具栏 介绍

1. 简介 工具栏 ToolStrip,一般紧贴在菜单栏下面 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到Enabled控件是否启用Dock定义要绑定到容器的控件边框,默认是topAnchor定义某个控件绑定到的容器的边缘。当控件锚定到某个边缘时&a…

基于MCGS的双容水箱液位控制系统设计【MCGS+MATLAB+研华工控机】

摘 要 液位控制技术在众多工业领域中扮演着至关重要的角色。无论是化工、制药、食品加工还是水处理行业,对液位进行精确控制都是保证生产流程稳定、产品质量可靠的关键环节。因此基于实验平台设计了液位自动控制系统。首先,根据实际液位的控制需求&…

NHANES数据库及应用

NHANES数据库使用 NHANES - National Health and Nutrition Examination Survey Homepage (cdc.gov) 保姆级NHANES数据库使用教程 - 哔哩哔哩 (bilibili.com) 该数据库所涉及的参与者的死亡状况 :Data Access - National Death Index (cdc.gov) TyG对CVD的影响研…

简单的基于Transformer的滚动轴承故障诊断(Pytorch)

递归神经网络在很长一段时间内是序列转换任务的主导模型,其固有的序列本质阻碍了并行计算。因此,在2017年,谷歌的研究人员提出了一种新的用于序列转换任务的模型架构Transformer,它完全基于注意力机制建立输入与输出之间的全局依赖…

【JAVA】javadoc,如何生成标准的JAVA API文档

目录 1.什么是JAVA DOC 2.标签 3.命令 1.什么是JAVA DOC 当我们写完JAVA代码,别人要调用我们的代码的时候要是没有API文档是很痛苦的,只能跟进源码去一个个的看,一个个方法的猜,并且JAVA本来就不是一个重复造轮子的游戏&#…

javaWeb项目-ssm+vue网上租车系统功能介绍

本项目源码:java-基于ssmvue的网上租车系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、…