Go语言中JSON的反序列化规则
Unmarshal 解析
func Unmarshal(data []byte, v any) error
Unmarshal 解析 JSON 编码的数据,并将结果存储在 v 指向的值中。如果 v 为 nil 或不是指针,Unmarshal 返回一个 InvalidUnmarshalError 错误。
Unmarshal 使用与 Marshal 相反的编码,根据需要分配 maps、slices 和 pointers,附加以下规则:
为了将 JSON 反序列化为指针,Unmarshal 首先处理 JSON 为 JSON 字面值 null 的情况。在那种情况下,Unmarshal 将指针设置为 nil。否则,Unmarshal 会将 JSON 反序列化为指针所指向的值。如果指针为 nil,Unmarshal 为它分配一个新值。
为了将 JSON 反序列化为实现了 Unmarshaler 接口的值,Unmarshal 会调用该值的 UnmarshalJSON 方法,包括当输入是一个 JSON null 时。否则,如果该值实现了 encoding.TextUnmarshaler 并且输入是一个 JSON 引号字符串,Unmarshal 使用该字符串的未引用形式调用该值的 UnmarshalText 方法。
为了将 JSON 反序列化为结构体,Unmarshal 将传入的对象键与 Marshal 使用的键匹配(是结构字段名还是它的标签),首选精确匹配,但也接受不区分大小写的匹配。默认情况下,没有对应结构字段的对象键将被忽略(参见 Decoder.DisallowUnknownFields 作为一种选择)。
为了将 JSON 反序列化为接口值,Unmarshal 在接口值中存储以下之一:
- bool,对应 JSON 布尔值
- float64,对应 JSON 数字
- string,对应 JSON 字符串
- []interface{},对应 JSON 数组
- map[string]interface{},对应 JSON 对象
- nil,对应 JSON null
为了将 JSON 数组反序列化为切片,Unmarshal 将切片长度重置为零,然后将每个元素追加到切片。作为一个特殊情况,为了将一个空的 JSON 数组反序列化为切片,Unmarshal 用一个新的空切片替换该切片。
为了将 JSON 数组反序列化为 Go 数组,Unmarshal 将 JSON 数组元素解码为相应的 Go 数组元素。如果 Go 数组小于 JSON 数组,额外的 JSON 数组元素将被丢弃。如果 JSON 数组小于 Go 数组,额外的 Go 数组元素将设置为零值。
为了将 JSON 对象反序列化为 map,Unmarshal 首先确定要使用的 map。如果 map 为 nil,Unmarshal 分配一个新的 map。否则,Unmarshal 重用现有的 map,保留现有的条目。然后,Unmarshal 将来自 JSON 对象的键值对存储在 map 中。map 的键类型必须是任何字符串类型,整数,实现 json.Unmarshaler,或实现 encoding.TextUnmarshaler。
如果 JSON 编码的数据包含语法错误,Unmarshal 返回一个 SyntaxError。
如果 JSON 值不适用于给定的目标类型,或者 JSON 数字溢出目标类型,Unmarshal 跳过该字段并尽其所能完成反序列化。如果没有遇到更严重的错误,Unmarshal 返回描述最早的这种错误的 UnmarshalTypeError。无论如何,不能保证在有问题的字段之后的所有剩余字段都会被反序列化到目标对象中。
JSON null 值反序列化为接口、map、指针或切片时,通过将该 Go 值设置为 nil 来完成。因为在 JSON 中,null 经常用来表示“不存在”,所以将 JSON null 反序列化为任何其他 Go 类型对该值没有影响,也不会产生错误。
当反序列化带引号的字符串时,无效的 UTF-8 或无效的 UTF-16 替代对不被视为错误。相反,它们被替换为 Unicode 替代字符 U+FFFD。
Go语言中JSON的反序列化规则的更多相关文章
- GO语言中json与map的转换
直接上代码(需要引入encoding/json包) // 当前程序的包名 package main // 导入其它的包 import ( "encoding/json" " ...
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...
- C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
- C语言中void*详解及应用
void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
- 转:C语言中的static变量和C++静态数据成员(static member)
转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量 a.静态局部变量在函数内定义,生存期为整个程序 ...
- C语言中.h和.c文件解析(很精彩)
C语言中.h和.c文件解析(很精彩) 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析 ...
- C语言中.h和.c文件解析
整理自C语言中.h和.c文件解析(很精彩) Part.1(林锐<高质量C/C++编程>) 通过头文件来调用库功能.在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的 ...
- C/C++语言中const的用法
1. const 在C和C++中的区别 C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...
- 转-C语言中.h和.c文件解析
C语言中.h和.c文件解析(很精彩) 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词 ...
随机推荐
- 如何使用C++ 在Word文档中创建列表
列表分类是指在Word文档中使用不同格式排序的列表,来帮助我们一目了然地表达出一段文字的主要内容.比如,当我们描述了某个主题的若干点,就可以用列表把它们一一表达出来,而不是写成完整的段落形式.同时,列 ...
- 最小编译器和 UI 框架「GitHub 热点速览」
如果有一个关键词来概述本周的 GitHub 热门项目的话,大概就是 van 和 sectorc 都用到的 smallest.只不过一个是前端的响应式框架,一个是搞编译的 C 编译器.它们除了轻量化这个 ...
- 终极指南!Terraform的进阶技巧
如果您已经对 Terraform 了如指掌,并期望自己的 IaC 技能有进一步提升的话,这篇文章很适合您!在本文中,我们将分享一些 Terraform 的高级使用技巧.从使用模块(module).工作 ...
- Windows全能终端神器MobaXterm
MobaXterm 又名 MobaXVT,是一款增强型终端.X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱. MobaXterm 可以开启多个终端视窗,以最新的 X 服务器为基础的 X ...
- ENVI5.6 安装教程,新手入门(超详细)附安装包和常见问题
ENVI是一个完整的遥感图像处理平台,广泛应用于科研.环境保护.气象.农业.林业.地球科学.遥感工程.水利.海洋等领域.目前ENVI已成为遥感影像处理的必备软件,包含辐射定标.大气校正.镶嵌裁剪.分类 ...
- SpringBoot进阶教程(七十六)多维度排序查询
在项目中经常能遇到,需要对某些数据集合进行多维度排序的需求.对于集合多条件排序解决方案也有很多,今天我们就介绍一种,思路大致是设置一个分值的集合,这个分值是按照需求来设定大小的,再根据分值的大小对集合 ...
- [ESP] 私有版Rainmaker User Mapping
[ESP] 私有版Rainmaker User Mapping 1. 设备烧录的程序esp-rainmaker/examples/gpio这个demo 我这里是自己的工程,可以参照 idf.py se ...
- JUC同步锁原理源码解析五----Phaser
JUC同步锁原理源码解析五----Phaser Phaser Phaser的来源 A reusable synchronization barrier, similar in functionalit ...
- ModifyAjaxResponse,修改ajax请求返回值,前后端调试之利器
一.概要 先看图 京豆多的离谱,你的第一想法肯定是:按F12修改了网页元素 没那么简单,你看支持刷新的 肯定还是假的,通过 Fiddler 或 Wireshark 等抓包工具修改了响应包:或者干脆改了 ...
- golang 实现四层负载均衡
大家好,我是蓝胖子,做开发的同学应该经常听到过负载均衡的概念,今天我们就来实现一个乞丐版的四层负载均衡,并用它对mysql进行负载均衡测试,通过本篇你可以了解到零拷贝的应用,四层负载均衡的本质以及实践 ...