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    stringage     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 mainimport ("encoding/json""fmt""log"
)// Person with name, age and hobbies
type Person struct {Name    stringAge     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 mainimport ("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 mainimport ("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:[]}
{} 

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

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

相关文章

流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-TS的详细介绍、应用场景及对比

一、前言 HTTP-FLV、WS-FLV、HTTP-TS 和 WS-TS 是针对 FLV 和 TS 格式视频流的不同传输方式。它们通过不同的协议实现视频流的传输,以满足不同的应用场景和需求。接下来我们对这些流媒体传输协议进行剖析。 二、传输协议 1、HTTP-FLV 介绍:基于 HTTP…

【宠粉赠书】科研绘图神器:MATLAB科技绘图与数据分析

小智送书第二期~ 为了回馈粉丝们的厚爱,今天小智给大家送上一套科研绘图的必备书籍——MATLAB科技绘图与数据分析。下面我会详细给大家介绍这套图书,文末留有领取方式。 图书介绍 《MATLAB科技绘图与数据分析》是一本综合性强、内容丰富的书籍&#x…

实践分享:鸿蒙跨平台开发实例

先来理解什么是跨平台 提到跨平台,要先理解什么是“平台”,这里的平台,就是指应用程序的运行环境,例如操作系统,或者是Web浏览器,具体的像HarmonyOS、Android、iOS、或者浏览器,都可以叫做平台…

Python读取wps中的DISPIMG图片格式

需求: 读出excel的图片内容,这放在微软三件套是很容易的,但是由于wps的固有格式,会出现奇怪的问题,只能读出:类似于 DISPIMG(“ID_2B83F9717AE1XXXX920xxxx644C80DB1”,1) 【该DISPIMG函数只有wps才拥有】 …

阿里云服务器-Linux搭建fastDFS文件服务器

阿里云官网购买服务器,一般会有降价活动,这两天就发现有活动,99计划活动(在活动期内,续费都是99元) 阿里云官网-云服务器ECS 在这里,我购买了这台服务器,活动期内续费每年99元&…

javaweb 期末复习

1. JDBC数据库连接的实现逻辑与步骤以及JDBC连接配置(单列模式) public class JDBCUtil {// 这些换成自己的数据库 private static final String DB_URL "jdbc:mysql://localhost:3306/你的数据库名称";private static final String USER &q…

10分钟部署一个个人博客

关于vuepress这里没必要过多介绍,感兴趣的可以直接去官网了解,下面是官网首页地址截图 :https://v2.vuepress.vuejs.org/zh/ 透过这张图,我们也可以大致的对这个框架的特点有一定的认识,这就够了。其他的东西我们在使用…

vue3+ Element-Plus 点击勾选框往input中动态添加多个tag

实现效果&#xff1a; template&#xff1a; <!--产品白名单--><div class"con-item" v-if"current 0"><el-form-item label"平台名称"><div class"contaion" click"onclick"><!-- 生成的标签 …

WPF界面设计

1、使用C#-WPF实现抽屉效果-炫酷漂亮的侧边栏导航菜单-SplitViewMD主题重绘原生控件的美观效果-提供源码Demo下载 码源地址&#xff1a;https://download.csdn.net/download/Prince999999/89424685 2、使用C#-WPF实现抽屉效果-菜单导航功能实现&#xff0c;常规的管理系统应该…

使用itextPDF实现PDF电子公章工具类

一、制作公章 在线网站&#xff1a;印章生成器 - Kalvin在线工具 (kalvinbg.cn) 然后对公章进行下载保存 盖章图片&#xff1a; 二、生成数字签名 2.1&#xff1a; java工具keytool生成p12数字证书文件 Keytool是用于管理和证书的工具&#xff0c;位于%JAVA_HOME%/bin目录。…

【Python】Python 2 测试网络连通性脚本

文章目录 前言1. 命令行传参2. 代码 前言 最近在只有python2的服务器上部署服务&#xff0c;不能用三方类库&#xff0c;这里出于好奇心学习下python。这里简单做个脚本&#xff0c;实现了检验网络连通性的功能&#xff08;类似于curl&#xff09;。 1. 命令行传参 使用命令…

和鲸科技执行总裁殷自强:面向空间数据协同分析场景的模型生命周期管理方法

导读&#xff1a; 由 ACM SIGSPATIAL 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff09;于 2024 年 4 月 25 日- 27 日在南京圆满召开&#xff0c;主题为“ AGI 时代下的空间数据智能”&#xff0c;旨在深入推动空间数据智能研究的理论进步与应…

TIM—通用定时器高级定时器

通用/高级定时器的功能 在基本定时器功能的基础上新增功能&#xff1a; 通用定时器有4个独立通道&#xff0c;且每个通道都可以用于下面功能。 &#xff08;1&#xff09;输入捕获&#xff1a;测量输入信号的周期和占空比等。 &#xff08;2&#xff09;输出比较&#xff1a;产…

115.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-调试优化结构体类型数据的创建

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载)

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载) iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia/&a…

【动态规划】| 路径问题之最小路径和 力扣64

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/minimum-path-sum/description/ 这道题目和之前一道…

基于C#开发web网页管理系统模板流程-参数传递

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 当用户长时间未在管理系统界面进行操作&#xff0c;或者用户密码进行了更改&#xff0c;显然用户必须重新登录以验证身份&#xff0c;如何实现这个功能呢&#xff1f; HTTP Cookie&#xff08;也叫 …

【云原生】docker swarm 使用详解

目录 一、前言 二、容器集群管理问题 2.1 docker集群管理问题概述 2.1.1 docker为什么需要容器部署 2.2 docker容器集群管理面临的挑战 三、docker集群部署与管理解决方案 四、Docker Swarm概述 4.1 Docker Swarm是什么 4.1.1 Docker Swarm架构图 4.1.2 Docker Swarm几…

【最新鸿蒙应用开发】——鸿蒙中的“Slot插槽”?@BuilderParam

构建函数-BuilderParam 传递 UI 1. 引言 BuilderParam 该装饰器用于声明任意UI描述的一个元素&#xff0c;类似slot占位符。 简而言之&#xff1a;就是自定义组件允许外部传递 UI Entry Component struct Index {build() {Column({ space: 15 }) {SonCom() {// 直接传递进来…

机器学习笔记 - 用于3D点云数据分割的Point Net的训练

一、数据集简述 ​在本教程中,我们将学习如何在斯坦福 3D 室内场景数据集 ( S3DIS )上训练 Point Net 进行语义分割。S3DIS 是一个 3D 数据集,包含来自多栋建筑的室内空间点云,占地面积超过 6000 平方米。Point Net使用整个点云,能够执行分类和分割任务。如果你一直在关注 …