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.词 ...
随机推荐
- 记一次618军演压测TPS上不去排查及优化
本文内容主要介绍,618医药供应链质量组一次军演压测发现的问题及排查优化过程.旨在给大家借鉴参考. 背景 本次军演压测背景是,2B业务线及多个业务侧共同和B中台联合军演. 现象 当压测商品卡片接口的时 ...
- C# .NET CORE .NET6 RSA 公钥加密 私钥解密
环境说明: .NET CORE 版本:.NET 6 . .NET CORE 对于RSA的支持: 1. .NET 6 中内置了对 PKCS1,PKCS8 2种私钥格式的支持. 2. 如果你要部署在Lin ...
- StencilJs学习之组件装饰器
stenciljs 可以方便的构建交互式组件 支持以下装饰器 component state prop watch method element event listen Component 装饰器 ...
- 有哪些ASIC加速技术可以实现低功耗运行?
目录 文章主题: 10. 有哪些ASIC加速技术可以实现低功耗运行? 背景介绍:随着移动设备.物联网.云计算等应用场景的不断增长,功耗成为了一个日益重要的技术问题.为了在移动设备上实现更长时间的运行, ...
- 【大数据OLAP技术新书推荐】 字节跳动、阿里巴巴大厂资深架构师程序员多年实践经验总结《ClickHouse入门、实战与进阶》
ClickHouse 领域集大成之作-ClickHouse 入门进阶实战的标准参考书-日常工作案头必备! 如果需要购买阅读的话,可以点击: https://item.jd.com/1007763561 ...
- 微服务bug之:openFeign远程调用返回类型转换异常
楼主是在使用easyexcel导出的时候,获取数据出现这个错误,因为Spring底层是这样处理的使用LinkedhashMap来承接查询结果,导致转换异常 public List<NeedAll ...
- GO web学习(一)
跟着b站https://space.bilibili.com/361469957 杨旭老师学习做的笔记 开启web服务 •http.ListenAndServer() •第一个参数是网络地址 如果为& ...
- animation动画+关键帧实现轮播图效果(再次学习)!
再次遇到要实现轮播图效果的时候,发现还是不怎么会,因为对js还没有熟练使用,只希望使用h5和css3实现效果 虽然之前已经学习了一遍了,但是还是不熟练,再次学习一下了 这次的可作为套板使用,无序列表为 ...
- 【调制解调】SSB 单边带调幅
说明 学习数字信号处理算法时整理的学习笔记.同系列文章目录可见 <DSP 学习之路>目录,代码已上传到 Github - ModulationAndDemodulation.本篇介绍 SS ...
- python:修改pdf的书签
我觉得修改pdf书签总体来说最方便的方式就是: 导出pdf书签为文本文件,修改书签文本文件后再导入到pdf中. 1.直接修改pdf书签 python中比较好用的pdf处理的库是pymupdf: pip ...