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的反序列化规则的更多相关文章

  1. GO语言中json与map的转换

    直接上代码(需要引入encoding/json包) // 当前程序的包名 package main // 导入其它的包 import ( "encoding/json" " ...

  2. .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

    JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...

  3. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  4. C语言中void*详解及应用

    void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...

  5. (七)C语言中的void 和void 指针类型

    许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...

  6. 转:C语言中的static变量和C++静态数据成员(static member)

    转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序 ...

  7. C语言中.h和.c文件解析(很精彩)

    C语言中.h和.c文件解析(很精彩)   简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析 ...

  8. C语言中.h和.c文件解析

    整理自C语言中.h和.c文件解析(很精彩) Part.1(林锐<高质量C/C++编程>) 通过头文件来调用库功能.在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的 ...

  9. C/C++语言中const的用法

    1. const 在C和C++中的区别     C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...

  10. 转-C语言中.h和.c文件解析

    C语言中.h和.c文件解析(很精彩)   简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词 ...

随机推荐

  1. 使用openresty替换线上nginx网关之openresty安装细节

    背景 线上跑了多年的一个网关业务,随着部门的拆分,逐渐有了一个痛点.该网关业务主要处理app端请求,app端发起的请求,采用http协议,post方法,content-type采用applicatio ...

  2. Android Studio历史版本下载地址汇总

    原文地址: Android Studio历史版本下载地址汇总 - Stars-One的杂货小窝 由于新公司不给自带电脑,然后给了台新的电脑,于是就是需要重新下载Android Studio 但众所周知 ...

  3. Linux多线程(8.3 线程同步与互斥)

    3. 线程的同步与互斥 为什么需要同步与互斥 ​ 一个进程运行时,数据存储在内存中.如果一个数据要进行运算,必须先将数据拷贝到寄存器中.比如要对栈上的一个int i进行"++"操作 ...

  4. Go语言编程技巧:实现高效的数据处理和企业应用程序

    目录 Go语言编程技巧:实现高效的数据处理和企业应用程序 摘要 Go语言是一种现代的编程语言,以其高效.简洁.安全.可靠等优点而备受欢迎.本文将介绍Go语言编程技巧,包括数据处理和企业应用程序方面的应 ...

  5. NextJS项目的部署以及多环境的实现

    背景 开发了个Next项目,将部署过程记录一下.另外由于项目准备了两个服务器分别作为开发自测的开发环境和交付给客户的生产环境使用:因此也介绍一下NextJS项目中多环境的配置. 项目结构 计划是让Ng ...

  6. 基于Sa-Token实现微服务之前的单点登录

    修改配置文件,准备好四个域名 127.0.0.1 auth.server.com 127.0.0.1 user.server.com 127.0.0.1 third.server.com 127.0. ...

  7. C++ 数独游戏

    C++ 数独游戏 直接上代码: 1 // 数独 sudoku 2 3 #include <iostream> 4 5 using namespace std; 6 7 int P[9][9 ...

  8. .NET写一个自己的Lambda表达式与表达式树

    LambdaExpression继承Expression Expression又继承LambdaExpressio 所以,Expression与 Expression的区别在于:泛型类以静态类型的方法 ...

  9. ASP.NET MVC4 学习笔记-1

    初学ASP.NET MVC,通过博客来记录自己的学习笔记! 创建一个新的 ASP.NET MVC 项目 在新建项目中选择 ASP.NET MVC4 Web Application,项目类型为空,视图引 ...

  10. [译]使用Python和Dash 创建一个仪表盘(上)

    介绍 在数据科学和分析的领域,数据能力的释放不仅是通过提取见解的方式, 同时也要能通过有效的方式来传达见解.这就是数据可视化发挥见解的地方. 数据可视化是信息和数据的可视化呈现. 它使用可视化元素,如 ...