20.2 JSON-JSON解码、映射数据类型、处理JSON响应

1. JSON解码

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

函数Unmarshal接受一个JSON字节切片和一个指定目标格式的接口。而这个借口即与JSON字符串中的结果相匹配的结构体类型的变量

  • 定义结构体类型
    • type Person struct { ... }
  • 创建结构体变量
    • p := Person{}
  • 将JSON格式的字符串转换JSON格式的字节切片
    • jb := []byte(js) 
  • 将JSON格式的字节切片解码为结构体变量
    • err := json.Unmarshal(jb, &p)

// 将JSON字符解码为结构体
//             []byte               json.Unmarshal 
// JSON字符串 ------> JSON字节切片 --------------> 结构体
package mainimport ("encoding/json""fmt""log"
)// Person with name, age and hobbies
type Person struct {Name    stringAge     int Hobbies []string
}func main() {js := `{"Name":"George","Age":40,"Hobbies":["Cycling","Cheese","Techno"]}`fmt.Println(js)jb := []byte(js)	// 将json字符串转化为字节切片p := Person{}	// json目标对象接口err := json.Unmarshal(jb, &p)if err != nil {log.Fatal(err)}fmt.Printf("%+v\n", p)
}
// 打印输出:
{"Name":"George","Age":40,"Hobbies":["Cycling","Cheese","Techno"]}
{Name:George Age:40 Hobbies:[Cycling Cheese Techno]} 

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

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

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

  • {"name":"George","age":40,"hobbies":["Cycling","Cheese","Techno"]}
  • type Person struct {
  •     Name    string   `json:"name"`
  •     Age     int      `json:"age"`
  •     Hobbies []string `json:"hobbies"`
  • }
// 映射JSON键到结构体字段
// 默认情况下,JSON字符串中的键和值分别映射结构体中的字段名和字段值,但
// 如果为结构体中的字段指定了JSON标签,则以标签文本对应JSON字符串的键
// 
// type 结构体 struct {
//     字段1 类型1 `json:"键1"` 
//     字段2 类型2 `json:"键2"` 
//     ... 
//     字段n 类型n `json:"键n"`
// }
package mainimport ("encoding/json""fmt""log""testing"
)
// Person with name, age and hobbies
type Person4 struct {Name    string   `json:"MyName"`Age     int      `json:"MyAge"`Hobbies []string `json:"MyHobbies"`
}func TestJson2Struct2(t *testing.T) {js := `{"MyName":"George","MyAge":40,"MyHobbies":["Cycling","Cheese","Techno"]}`fmt.Println(js)jb := []byte(js)p := Person4{}err := json.Unmarshal(jb, &p)if err != nil {log.Fatal(err)}fmt.Printf("%+v\n", p)
}
// 打印输出:
{"name":"George","age":40,"hobbies":["Cycling","Cheese","Techno"]}
{Name:George Age:40 Hobbies:[Cycling Cheese Techno]}

 2. 映射数据类型

Go是一种强类型语言,而JavaScript是一种弱类型语言encoding/json包根据以下所列规则,在两种语言的类型系统之间进行显式类型转换。

JSON

Go

Boolean

bool

Number

float64

String

string

Array

[]interface{}(切片类型)

Object

map[string]interface{}

(映射类型)

Null

nil

js := `{

    "Boolean" : false,

    "Number"  : 4,

    "String"  : "Helo World!",

    "Array"   : [1, 2, 3, 4, 5],

    "Object"  : {"MON": 1, "TUE": 2, "WED": 3, "THU": 4, "FRI": 5},

    "Null"    : null

    }`

type Types struct {

    Boolean bool

    Number  float64

    String  string

    Array   []int

    Object  map[string]int

    Null    *int

   }

// JSON的数据类型
// JSON的数据类型与Go的数据类型存在如下对应关系: 
//
// +--------------+------------------------+
// |     JSON     |           Go           |
// +--------------+------------------------+
// | Boolean      | bool                   |
// | Number       | float64                |
// | String       | string                 |
// | Array        | []interface{}          |
// | Object       | map[string]interface{} |
// | Null         | nil                    |
// +--------------+------------------------+
package mainimport ("encoding/json""fmt""log"
)
// Types of JSON data
type Types struct {Boolean bool Number  float64String  string Array   []int Object  map[string]int Null    *int 
} func main() {js := `{"Boolean" : false,"Number"  : 4,"String"  : "Helo World!","Array"   : [1, 2, 3, 4, 5],"Object"  : {"MON": 1, "TUE": 2, "WED": 3, "THU": 4, "FRI": 5},"Null"    : null
}`fmt.Println(js)jb := []byte(js)t := Types{}err := json.Unmarshal(jb, &t)if err != nil {log.Fatal(err)}fmt.Printf("%+v\n", t)
} 
// 打印输出:
{"Boolean" : false,"Number"  : 4,"String"  : "Helo World!","Array"   : [1, 2, 3, 4, 5],"Object"  : {"MON": 1, "TUE": 2, "WED": 3, "THU": 4, "FRI": 5},"Null"    : null
}
{Boolean:false Number:4 String:Helo World! Array:[1 2 3 4 5] Object:map[MON:1 TUE:2 WED:3 THU:4 FRI:5] Null:<nil>}

 3. 处理JSON响应

在Go语言中,通过标准库net/http包的Get函数获取到的HTTP响应是一个输入流(实现了io.Reader接口),而非字符串或字节切片。其中JSON格式的数据无法直接通过encoding/json包的Unmarshal函数解码为结构体变量,需先转化为字节切片。

调用encoding/json包的NewDecoder函数可以创建一个JSON解码器。该解码器将其被创建时传入的输入流作为数据源,并通过Decode方法将数据源中的JSON数据解码为结构体变量,借助该方法的参数输出给调用者。

  • type User struct { ... }
  • response, err := http.Get("https://api.github.com/users/shapeshed")
  • decoder, user := json.NewDecoder(response.Body), User{}返回解码器对象decoder,解码器具备了对json格式响应的读取能力;
  • err = decoder.Decode(&user) // 解码并填写user结构体的字段
// 解析JSON格式的API返回值
// 响应 = http.Get(API的URL)
// 解码器 = json.NewDecoder(响应体)
// 解码器.Decode(&结构体)
package main
import ("encoding/json""fmt""log""net/http"
)
// User of Github 
type User struct {Name string `json:"name"`Blog string `json:"blog"`
}func main() {    response, err := http.Get( // 获取response"https://api.github.com/users/shapeshed")if err != nil {log.Fatal(err)}defer response.Body.Close()decoder, user := json.NewDecoder(response.Body), User{}err = decoder.Decode(&user)if err != nil {log.Fatal(err)}fmt.Printf("%+v\n", user)
}
// 打印输出:
{Name:George Ornbo Blog:http://shapeshed.com}

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

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

相关文章

聚鼎科技:现在的装饰画做起来难吗

在当代&#xff0c;装饰画作为一种体现个人品味和审美情趣的方式&#xff0c;已经广泛应用于各种室内空间。不少人会产生这样的疑问&#xff1a;在现代化技术和材料的支持下&#xff0c;制作一幅装饰画是变得容易了&#xff0c;还是依旧充满挑战? 现代科技的确为装饰画的制作带…

微信小程序查分易如何使用?

期末马上到了&#xff0c;老师们又开始为发放成绩而头疼了&#xff0c;堆积如山的试卷&#xff0c;密密麻麻的分数&#xff0c;还有那些不断响起的家长电话&#xff0c;真是让人心烦。别担心&#xff0c;今天就让我来介绍一个让老师“偷懒”神器——查分易微信小程序 第一步&am…

ROS中Twist消息类型

Twist消息类型在Robot Operating System (ROS)中是一个常见的数据结构&#xff0c;主要用于描述物体的线性速度和角速度。这种消息类型在ROS的geometry_msgs包中定义&#xff0c;常用于机器人运动控制&#xff0c;尤其是当需要向机器人发布速度指令时。 Twist消息由两个Vector…

6月14日 Qtday2

#include "widget.h" #include "ui_widget.h" #include <QTimer> using namespace std; Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), lab1(new QLabel(this)) //初始化一个标签显示登录状态 {//设置华清远见的标签图…

再谈 dijkstra 算法和最短路径问题

前置文章&#xff1a; dijkstra 算法为什么高效 有向图的负权值边与建模 求单源最短路径的新方法 前天晚上实现了一个基于 dijkstra 算法的求单源最短路径的新算法&#xff0c;整理了一篇文章。我非常不愿意把一些直观的问题太过于技术化&#xff0c;但多年的职业经历偏偏让一…

C#——静态成员和非静态成员详情

静态成员和非静态成员 调用: 静态属性(static) : 类名.属性名调用 非静态属性(没static) : 1.先创建对象 2.对象.属性 特点: 静态方法里面只能访问静态成员 非经态方法中可以访问所有的属性 static数据成员在类的内部声明&#xff0c;但只能在类的外部定义&#xff0c;…

【软件安装9】OpenCV多版本安装Ubuntu18.04

文章目录 一、查看已安装的Opencv版本二、安装新版本三、多版本OpenCV切换 OpenCV 官网 在此 一、查看已安装的Opencv版本 查看已安装opencv的版本 pkg-config opencv --modversion官网下载对应的版本&#xff0c;并解压 opencv3.4.3 二、安装新版本 进入前置准备里下载…

24年法考报名照片千万别乱拍,否则卡审

法考报名照片每年都有很多被卡审&#x1f62d; 常见的问题是 ①照片比例不对&#xff0c;无法上传&#xff0c;人像比例要求非常严格 ②照片像素错误&#xff0c;不能直接拿大图压缩图片&#xff0c;需要做出413*626像素的法考证件照 ③照片文件偏大&#xff0c;照片要求40-100…

单触控单输出触摸开关芯片PT2052A

1.产品概述 PT2052封装和丝印 PT2052A 是一款单通道触摸检测芯片。该芯片内建稳压电路&#xff0c;提供稳定电压给触摸感应电路使用&#xff0c;同时内部集成高效完善的触摸检测算法&#xff0c;使得芯片具有稳定的触摸检测效果。该芯片专为取代传统按键而设计&#xff0c;具有…

【精品方案】离散型制造行业智能工厂标准解决方案(49页 PPT)

引言&#xff1a;随着科技的不断进步和制造业的转型升级&#xff0c;离散型制造行业正面临着从传统制造向智能制造转型的迫切需求。离散型制造行业涉及的产品种类繁多&#xff0c;生产流程复杂&#xff0c;对生产效率、产品质量和成本控制有着极高的要求。因此&#xff0c;开发…

SQL中的UPDATE语句:别让你的数据“离家出走”

sql的update操作正式环境用的很少&#xff0c;但是在测试环境还是用的挺多的。 想象一下&#xff0c;你正在管理一个学校的数据库&#xff0c;其中有一个students表&#xff0c;记录着每个学生的信息。有一天&#xff0c;你接到通知说某个学生的年龄或成绩需要更新。这时&…

【Java并发编程之美 | 第一篇】并发编程线程基础

文章目录 1.并发编程线程基础1.1什么是线程和进程&#xff1f;1.2线程创建与运行1.2.1继承Thread类1.2.2实现Runnable接口1.2.3实现Callable接口&#xff08;与线程池搭配使用&#xff09;1.2.4小结 1.3线程常用方法1.3.1线程等待与通知1.3.2线程睡眠1.3.3让出CPU执行权1.3.4线…

漫步者开放式耳机值得买吗?漫步者、西圣、小米硬核测评pk性能!

说起开放式蓝牙耳机&#xff0c;相信大部分朋友都不会陌生。与传统的封闭式耳机相比&#xff0c;开放式蓝牙耳机不仅提升了佩戴舒适度&#xff0c;还对耳朵有良好的保护效果。特别适合喜欢户外运动和长途旅行的用户。然而&#xff0c;由于市场上产品众多&#xff0c;选择一款高…

用Python向Word文档添加页眉和页脚

用Python向Word文档添加页眉和页脚 添加页眉和页脚效果代码 添加页眉和页脚 在本文中&#xff0c;我们将用python向文档中添加页眉和页脚。 效果 添加前的文档&#xff1a; 添加页眉和页脚后&#xff1a; 代码 from docx import Documentdef add_header_footer(doc_path…

UE4_后期_ben_模糊和锐化滤镜

学习笔记&#xff0c;不喜勿喷&#xff0c;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 本篇教程主要介绍后期处理的简单模糊和锐化滤镜效果&#xff0c;学习之前首先要回顾下上节课介绍的屏幕扭曲效果&#xff1a; 这是全屏效果&#xff0c;然后又介绍了几种蒙版&#…

MySQL与PostgreSQL关键对比四(关联查询性能)

引言&#xff1a;MySQL单表的数据规模一般建议在百万级别&#xff0c;而PostgreSQL的单表级别一般可以到亿级&#xff0c;如果是MPP版本就会更多。从基础数据建议上&#xff0c;不难看出&#xff0c;MySQL在Join的情况下也就是主要查询的情况下性能和PostgreSQL相差还是很大的。…

Vue35-生命周期小结

一、8个&#xff0c;4对生命周期函数 第一对&#xff1a;数据监测、数据代理&#xff0c;创建之前和创建之后。 注意&#xff1a;不是vm的创建&#xff01;&#xff01;&#xff01; 第二队&#xff1a;beforeMount和mounted 第三队&#xff1a;beforeUpdate和update 第四队…

vue-element-admin后台集成方案

官网&#xff1a;介绍 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide 1.git环境安装配置及简单操作 1.1git环境安装配置 git软件官网&#xff1a;Git - Downloads (git-scm.com)https://git-scm.com/downloads 下载…

印尼slot游戏pwa做Facebook广告代投推广流程

印尼slot游戏pwa做Facebook广告代投推广流程 随着互联网的普及和移动设备的广泛应用&#xff0c;社交媒体平台如Facebook成为了企业和个人进行品牌推广的重要渠道。在印尼的slot游戏行业中&#xff0c;利用PWA&#xff08;Progressive Web App&#xff09;技术进行Facebook广告…

第N4周:中文文本分类-Pytorch实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 一、准备工作 1.任务说明 文本分类流程图&#xff1a; 2.加载数据 ​编辑 二、…