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.mzph.cn/web/26069.shtml

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

相关文章

简单脉冲动画效果实现

简单脉冲动画效果实现 效果展示 CSS 知识点 CSS 变量的灵活使用CSS 动画使用 页面整体结构实现 <div class"pulse"><span style"--i: 1"></span><span style"--i: 2"></span><span style"--i: 3"…

快递一键查询,只需快递单号,轻松掌握全程物流信息,让您的包裹追踪无忧!

在快节奏的现代生活中&#xff0c;快递已经成为我们生活中不可或缺的一部分。无论是网购的宝贝、亲朋好友寄来的礼物&#xff0c;还是工作中的紧急文件&#xff0c;快递都承载着我们的期待和需要。然而&#xff0c;面对众多的快递公司和复杂的查询流程&#xff0c;如何快速、准…

Docker:安装 Orion-Visor 服务器运维的技术指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 Orion-Visor 是一种用于管理和监控容器的工具。它提供了一个直观的界面&#xff0c;用于查看容器的状态、资源使用情况以及日志等信息。在这篇技术博客中&#xff0c;我们将介绍如何…

南通logo的标志设计详解!教你打造独特品牌标识!

在品牌设计中&#xff0c;南通logo的标志设计是至关重的环。一个特而吸引力的标志能够让品牌在市场中脱颖而出&#xff0c;并传达品牌的价值和特点。 那么&#xff0c;该如何进行南通logo的标志设计呢?在本文中&#xff0c;将详细讲南通logo的标志设计过程和要点&#xff0c;…

微信小程序双层/多层 wx:for 循环嵌套,关于内外层的 index 和 item ;data-index 传递两个参数

微信小程序用 wx:for 循环可以快速将后端 js 的数组快速显示到前端&#xff1b; 那假如数组中嵌套数组&#xff1b;就存在内外层两层及以上的多层嵌套循环了。 那么如果两层的嵌套式循环 index 究竟是属于哪一层呢&#xff1f;item 又属于哪一个呢&#xff1f; <view><…

“新E代弯道王”MAZDA EZ-6亮相2024重庆国际车展

6月7日-6月16日&#xff0c;第二十六届重庆国际车展隆重开幕&#xff0c;合资品牌首款基于纯电平台的新能源轿车MAZDA EZ-6&#xff08;以下称EZ-6&#xff09;领衔长安马自达全系车型亮相N8馆T01展台。车展期间&#xff0c;重庆及周边地区的马自达用户、粉丝、车友可前往长安马…

代码签名证书怎么申请?有什么条件?

代码签名证书是由证书颁发机构(CA)颁发的数字证书&#xff0c;用于验证组织/软件作者的身份并确保软件/应用程序/程序的完整性。它们包含组织的数字签名、组织名称和时间戳&#xff08;如果需要&#xff09;。 软件开发人员利用代码签名证书将其数字签名放在应用程序、可执行文…

弱智吧”,人类抵御AI的最后防线

“写遗嘱的时候错过了deadline怎么办&#xff1f;” “怀念过去是不是在时间的长河里刻舟求剑&#xff1f;” “英语听力考试总是听到两个人在广播里唠嗑&#xff0c;怎么把那两个干扰我做题的人赶走&#xff1f;” 以上这些饱含哲学但好像又莫名其妙的问题&#xff0c;出自…

【简单学习一下卷积神经网络】-基于肆十二的高考例子

前言一、白话卷积神经网络总结 前言 【参考】 主要是P2⇨手把手教你用tensorflow2训练自己的数据集 -------2024/5/4 一、白话卷积神经网络 高考前需要大量的做题训练---->相当于数据集。 做题过程中【于标准答案进行比对】产生的错题⇨loss&#xff08;误差&#xff09; 回…

SkyWalking之P0核心业务场景输出调用链路应用

延伸扩展&#xff1a;XX核心业务场景 路由标签打标、传播、检索 链路标签染色与传播 SW: SkyWalking的简写 用户请求携带HTTP头信息X-sw8-correlation “X-sw8-correlation: key1value1,key2value2,key3value3” 网关侧读取解析HTTP头信息X-sw8-correlation&#xff0c;然后通过…

C++九州控制地址结构else 陈述

else如同英文字义&#xff0c;九州qa98錪cc否则的意思&#xff0c;通常放在if的后面&#xff0c;若if的条件为真&#xff0c;就执行if底下大括弧围起来的程式区块&#xff0c;若为假&#xff0c;就执行else底下大括弧围起来的程式区块。 形式如下&#xff1a; 这个概念用于二选…

盲盒小程序推广与运营策略的挑战

随着盲盒经济的兴起&#xff0c;越来越多的商家开始关注并尝试开发盲盒小程序。然而&#xff0c;在推广和运营盲盒小程序的过程中&#xff0c;我们也不可避免地会遇到一些挑战。下面&#xff0c;我将就用户获取、留存以及活跃度提升等方面&#xff0c;探讨这些挑战及可能的应对…

动态内存管理<C语言>

导言 在C语言学习阶段&#xff0c;指针、结构体和动态内存管理&#xff0c;是后期学习数据结构的最重要的三大知识模块&#xff0c;也是C语言比较难的知识模块&#xff0c;但是“天下无难事”&#xff0c;只要认真踏实的学习&#xff0c;也能解决&#xff0c;所以下文将介绍动态…

镜舟科技与千丁数科开展战略洽谈,探索智慧空间与数据的深度融合

数据作为当下最重要的生产要素之一&#xff0c;数据分析与智慧空间科技的结合正成为推动企业发展的新引擎 。 5 月 15 日&#xff0c;镜舟科技与千丁数科在北京开展战略合作洽谈。本次会议旨在探索双方在智慧空间科技和数据分析领域的合作潜力&#xff0c;共同推进数字经济的新…

Gartner发布企业人工智能治理指南:以企业通用治理框架为基础,确定针对框架六大支柱的AI特定因素

人工智能&#xff08;AI&#xff09;不仅发展迅速而且可能会放大人类的偏见&#xff0c;如何对其实施有效的治理是数据和分析领导者面临的一个挑战。本文提供了一种全面的方法&#xff0c;可用于扩展企业的治理框架&#xff0c;引入信任、透明度和多样性等AI特定的考虑因素。 主…

CMDB是什么实践案例分享

CMDB是什么&实践案例分享 腾讯蓝鲸CMDB通过集中化管理、自动化发现、灵活的模型定义和开放的API&#xff0c;帮助企业高效管理IT资产和配置项&#xff0c;提升运维效率和服务质量&#xff0c;同时支持与其他系统的无缝集成&#xff0c;适用于金融、制造、互联网等多个行业…

WeTrade 在印度尼西亚井里汶成功举办研讨会

端午安康!在这欢乐的假日里&#xff0c;WeTrade和各位投资者分享一则喜事!如果有意参加的&#xff0c;可以联系小编! 5 月底&#xff0c;我们在印度尼西亚井里汶成功举办了一场精彩研讨会&#xff0c;聚集了来自印度尼西亚各地交易社区的100多名交易者。 此次研讨会由经验丰富…

SpringBoot快速部署(2)—不使用docker的常规方法

一、软件下载和部署前准备 安装软件 获取软件安装包 然后上传到服务器的 /tmp 目录下。 软件&#xff1a;nginx、jdk、mysql 下载 X-shell 和 Xftp 注意&#xff1a;这个页面下载安装的才可以免费使用。家庭/学校免费 - NetSarang Website 安装jdk 1.8 tar -zxvf /tmp/jdk-…

服务器数据恢复—热备盘未完全启用导致raid5阵列崩溃的数据恢复案例

服务器存储故障&#xff1a; 一台EMC某型号存储由于存储中raid5阵列出现故障导致服务器崩溃&#xff0c;由于数据涉密&#xff0c;需要工程师到现场恢复数据。 服务器数据恢复工程师到现场后对数据进行检测&#xff0c;经过检测发现服务器崩溃是由于raid中某些硬盘掉线所导致。…

使用 actor-critic 方法来控制 CartPole-V0 游戏

CartPole 介绍 在一个光滑的轨道上有个推车&#xff0c;杆子垂直微置在推车上&#xff0c;随时有倒的风险。系统每次对推车施加向左或者向右的力&#xff0c;但我们的目标是让杆子保持直立。杆子保持直立的每个时间单位都会获得 1 的奖励。但是当杆子与垂直方向成 15 度以上的…