JSON(JavaScript 对象表示,JavaScript Object Notation)作为一种轻量级的数据交换格式1,在今天几乎占据了绝大多数的市场份额。虽然与更紧凑的数据交换格式相比,它的序列化和反序列化性能不足,但是 JSON 提供了良好的可读性与易用性,在不追求极致机制性能的情况下,使用 JSON 作为序列化格式是一种非常好的选择。
9.1.1 设计原理
几乎所有的现代编程语言都会将处理 JSON 的函数直接纳入标准库,Go 语言也不例外,它通过 encoding/json 对外提供标准的 JSON 序列化和反序列化方法,即 encoding/json.Marshal 和 encoding/json.Unmarshal,它们也是包中最常用的两个方法。
![](data:image/png;base64,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)
图 9-1 序列化和反序列化
序列化和反序列化的开销完全不同,JSON 反序列化的开销是序列化开销的好几倍,相信这背后的原因也非常好理解。Go 语言中的 JSON 序列化过程不需要被序列化的对象预先实现任何接口,它会通过反射获取结构体或者数组中的值并以树形的结构递归地进行编码,标准库也会根据 encoding/json.Unmarshal 中传入的值对 JSON 进行解码。
Go 语言 JSON 标准库编码和解码的过程大量地运用了反射这一特性,你会在本节的后半部分看到大量的反射代码,这一小节就不过多介绍了。我们在这里会简单介绍 JSON 标准库中的接口和标签,这是它为开发者提供的为数不多的影响编解码过程的接口。
接口
JSON 标准库中提供了 encoding/json.Marshaler 和 encoding/json.Unmarshaler 两个接口分别可以影响 JSON 的序列化和反序列化结果:
type Marshaler interface {
MarshalJSON()([] byte, error)
}
type Unmarshaler interface {
UnmarshalJSON([] byte) error
}
在 JSON 序列化和反序列化的过程中,它会使用反射判断结构体类型是否实现了上述接口,如果实现了上述接口就会优先使用对应的方法进行编码和解码操作,除了这两个方法之外,Go 语言其实还提供了另外两个用于控制编解码结果的方法,即 encoding.TextMarshaler 和 encoding.TextUnmarshaler:
type TextMarshaler interface {
MarshalText()(text[] byte, err error)
}
type TextUnmarshaler interface {
UnmarshalText(text[] byte) error
}
一旦发现 JSON 相关的序列化方法没有被实现,上述两个方法会作为候选方法被 JSON 标准库调用并参与编解码的过程。总的来说,我们可以在任意类型上实现上述这四个方法自定义最终的结果,后面的两个方法的适用范围更广,但是不会被 JSON 标准库优先调用。
标签
Go 语言的结构体标签也是一个比较有趣的功能,在默认情况下,当我们在序列化和反序列化结构体时,标准库都会认为字段名和 JSON 中的键具有一一对应的关系,然而 Go 语言的字段一般都是驼峰命名法,JSON 中下划线的命名方式相对比较常见,所以使用标签这一特性直接建立键与字段之间的映射关系是一个非常方便的设计。
![](data:image/png;base64,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)
图 9-2 结构体与 JSON 的映射
JSON 中的标签由两部分组成,如下所示的 name 和 age 都是标签名,后面的所有的字符串是标签选项,即 encoding/json.tagOptions,标签名和字段名会建立一一对应的关系,后面的标签选项也会影响编解码的过程:
type Author struct {
Name string `json:"name,omitempty"`
Age int32 `json:"age,string,omitempty"`
}
常见的两个标签是 string 和 omitempty,前者表示当前的整数或者浮点数是由 JSON 中的字符串表示的,而另一个字段 omitempty 会在字段为零值时,直接在生成的 JSON 中忽略对应的键值对,例如:"age": 0、"author": "" 等。标准库会使用如下所示的 encoding/json.parseTag 来解析标签:
func parseTag(tag string)(string, tagOptions) {
if idx: = strings.Index(tag, ",");
idx != -1 {
return tag[: idx], tagOptions(tag[idx + 1: ])
}
return tag, tagOptions("")
}
从该方法的实现中,我们能分析出 JSON 标准库中的合法标签是什么形式的:标签名和标签选项都以 , 连接,最前面的字符串为标签名,后面的都是标签选项。
9.1.2 序列化
encoding/json.Marshal 是 JSON 标准库中提供的最简单的序列化函数,它会接收一个 interface{} 类型的值作为参数,这也意味着几乎全部的 Go 语言变量都可以被 JSON 标准库序列化,为了提供如此复杂和通用的功能,在静态语言中使用反射是常见的选项,下面我们来深入了解一下它的实现:
func Marshal(v interface {})([] byte, error) {
e: = newEncodeState()
err: = e.marshal(v, encOpts {
escapeHTML: true
})
if err != nil {
return nil, err
}
buf: = append([] byte(nil), e.Bytes()...)
encodeStatePool.Put(e)
return buf,
nil
}
上述方法会调用 encoding/json.newEncodeState 从全局的编码状态池中获取 encoding/json.encodeState,随后的序列化过程都会使用这个编码状态,该结构体也会在编码结束后被重新放回池中以便重复利用。
![](data:image/png;base64,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)
图 9-3 序列化调用栈
按照如上所示的复杂调用栈,一系列的序列化方法在最后获取了对象的反射类型并调用了 encoding/json.newTypeEncoder 这个核心的编码方法,该方法会递归地为所有的类型找到对应的编码方法,不过它的执行过程可以分成以下两个步骤:
1.获取用户自定义的 encoding/json.Marshaler 或者 encoding.TextMarshaler 编码器;
2.获取标准库中为基本类型内置的 JSON 编码器;
在该方法的第一部分,我们会检查当前值的类型是否可以使用用户自定义的编码器,这里有两种不同的判断方法:
func newTypeEncoder(t reflect.Type, allowAddr bool) encoderFunc {
if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(marshalerType) {
return newCondAddrEncoder(addrMarshalerEncoder, newTypeEncoder(t, false))
}
if t.Implements(marshalerType) {
return marshalerEncoder
}
if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(textMarshalerType) {
return newCondAddrEncoder(addrTextMarshalerEncoder, newTypeEncoder(t, false))
}
if t.Implements(textMarshalerType) {
return textMarshalerEncoder
}
...
}
1.如果当前值是值类型、可以取地址并且值类型对应的指针类型实现了 encoding/json.Marshaler 接口,调用 encoding/json.newCondAddrEncoder 获取一个条件编码器,条件编码器会在 encoding/json.addrMarshalerEncoder 失败时重新选择新的编码器;
2.如果当前类型实现了 encoding/json.Marshaler 接口,可以直接使用 encoding/json.marshalerEncoder 序列化;
在这段代码中,标准库对 encoding.TextMarshaler 的处理也几乎完全相同,只是它会先判断 encoding/json.Marshaler 接口,这也印证了我们在设计原理一节中的推测。
encoding/json.newTypeEncoder 会根据传入值的反射类型获取对应的编码器,其中包括 bool、int、float 等基本类型编码器等和数组、结构体、切片等复杂类型的编码器:
func newTypeEncoder(t reflect.Type, allowAddr bool) encoderFunc {
...
switch t.Kind() {
case reflect.Bool:
return boolEncoder
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return intEncoder
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return uintEncoder
case reflect.Float32:
return float32Encoder
case reflect.Float64:
return float64Encoder
case reflect.String:
return stringEncoder
case reflect.Interface:
return interfaceEncoder
case reflect.Struct:
return newStructEncoder(t)
case reflect.Map:
return newMapEncoder(t)
case reflect.Slice:
return newSliceEncoder(t)
case reflect.Array:
return newArrayEncoder(t)
case reflect.Ptr:
return newPtrEncoder(t)
default:
return unsupportedTypeEncoder
}
}
我们在这里就不一一介绍全部的内置类型编码器了,只挑选其中几个帮助各位读者了解整体的设计。首先我们来看布尔值的 JSON 编码器,它的实现很简单,甚至没有太多值得介绍的地方:
func boolEncoder(e * encodeState, v reflect.Value, opts encOpts) {
if opts.quoted {
e.WriteByte('"')
}
if v.Bool() {
e.WriteString("true")
} else {
e.WriteString("false")
}
if opts.quoted {
e.WriteByte('"')
}
}
它会根据当前值向编码状态中写入不同的字符串,也就是 true 或者 false,除此之外还会根据编码配置决定是否要在布尔值周围写入双引号 ",而其他的基本类型编码器也都大同小异。
复杂类型的编码器有着相对复杂的控制结构,我们在这里以结构体的编码器 encoding/json.structEncoder 为例介绍它们的原理,encoding/json.newStructEncoder 会为当前结构体的所有字段调用 encoding/json.typeEncoder 获取类型编码器并返回 encoding/json.structEncoder.encode:
func newStructEncoder(t reflect.Type) encoderFunc {
se: = structEncoder {
fields: cachedTypeFields(t)
}
return se.encode
}
从 encoding/json.structEncoder.encode 的实现我们能看出结构体序列化的结果,该方法会遍历结构体中的全部字段,在写入了字段名后,它会调用字段对应类型的编码方法将该字段对应的 JSON 写入缓冲区:
func(se structEncoder) encode(e * encodeState, v reflect.Value, opts encOpts) {
next: = byte('{')
FieldLoop: for i: = range se.fields.list {
f: = & se.fields.list[i]
fv: = v
for _,
i: = range f.index {
if fv.Kind() == reflect.Ptr {
if fv.IsNil() {
continue FieldLoop
}
fv = fv.Elem()
}
fv = fv.Field(i)
}
if f.omitEmpty && isEmptyValue(fv) {
continue
}
e.WriteByte(next)
next = ','
e.WriteString(f.nameNonEsc)
opts.quoted = f.quoted
f.encoder(e, fv, opts)
}
if next == '{' {
e.WriteString("{}")
} else {
e.WriteByte('}')
}
}
数组以及指针等编码器的实现原理与该方法也没有太多的区别,它们都会使用类似的策略递归地调用持有字段的编码方法,这也就能形成一个如下图所示的树形结构:
![](data:image/png;base64,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)
图 9-4 序列化与树形结构体
树形结构的所有叶节点都是基础类型编码器或者开发者自定义的编码器,得到了整棵树的编码器之后会调用 encoding/json.encodeState.reflectValue 从根节点依次调用整棵树的序列化函数,整个 JSON 序列化的过程查找类型和子类型的编码方法并调用的过程,它利用了大量反射的特性做到了足够的通用。
9.1.3 反序列化
标准库会使用 encoding/json.Unmarshal 处理 JSON 的反序列化,与执行过程确定的序列化相比,反序列化的过程是逐渐探索的过程,所以会复杂很多,开销也会高出几倍。因为 Go 语言的表达能力比较有限,反序列化的使用相对比较繁琐,所以需要传入一个变量帮助标准库进行反序列化:
func Unmarshal(data[] byte, v interface {}) error {
var d decodeState
err: = checkValid(data, & d.scan)
if err != nil {
return err
}
d.init(data)
return d.unmarshal(v)
}
在真正执行反序列化之前,我们会先调用 encoding/json.checkValid 验证传入 JSON 的合法性保证在反序列化的过程中不会遇到语法错误的问题,在通过合法性的验证之后,标准库会初始化数据并调用 encoding/json.decodeState.unmarshal 开始反序列化:
func(d * decodeState) unmarshal(v interface {}) error {
rv: = reflect.ValueOf(v)
if rv.Kind() != reflect.Ptr || rv.IsNil() {
return &InvalidUnmarshalError {
reflect.TypeOf(v)
}
}
d.scan.reset()
d.scanWhile(scanSkipSpace)
err: = d.value(rv)
if err != nil {
return d.addErrorContext(err)
}
return d.savedError
}
如果传入的值不是指针或者是空指针,当前方法会返回我们经常会见到的错误 encoding/json.InvalidUnmarshalError,使用格式化输出可以将该错误转换成 “json: Unmarshal(non-pointer xxx)"。该方法调用的 encoding/json.decodeState.value 是所有反序列化过程的执行入口:
func(d * decodeState) value(v reflect.Value) error {
switch d.opcode {
default: panic(phasePanicMsg)
case scanBeginArray:
...
case scanBeginLiteral:
...
case scanBeginObject: if v.IsValid() {
if err: = d.object(v);
err != nil {
return err
}
} else {
d.skip()
}
d.scanNext()
}
return nil
}
该方法作为最顶层的反序列化方法可以接收三种不同类型的值,也就是数组、字面量和对象,这三种类型都可以作为 JSON 的顶层对象,我们首先来了解一下标准库是如何解析 JSON 中对象的,该过程会使用 encoding/json.decodeState.object 进行反序列化,它会先调用 encoding/json.indirect 查找当前类型对应的非指针类型:
func(d * decodeState) object(v reflect.Value) error {
u, ut, pv: = indirect(v, false)
if u != nil {
start: = d.readIndex()
d.skip()
return u.UnmarshalJSON(d.data[start: d.off])
}
...
}
在调用 encoding/json.indirect 的过程中,如果当前值的类型是 **Type,那么它会依次检查形如 **Type、*Type 和 Type 类型是否实现了 encoding/json.Unmarshal 或者 encoding.TextUnmarshaler 接口;如果实现了该接口,标准库会直接调用 UnmarshalJSON 使用开发者自定义的方法完成反序列化。
在其他情况下,我们仍然会回到默认的逻辑中处理对象中的键值对,如下所示的代码会调用 encoding/json.decodeState.rescanLiteral 扫描 JSON 中的键并在结构体中找到对应字段的反射值,接下来继续扫描符号 : 并调用 encoding/json.decodeState.value 解析对应的值:
func(d * decodeState) object(v reflect.Value) error {
...
v = pv
t: = v.Type()
fields = cachedTypeFields(t)
for {
start: = d.readIndex()
d.rescanLiteral()
item: = d.data[start: d.readIndex()]
key,
_: = d.unquoteBytes(item)
var subv reflect.Value
var f * field
if i,
ok: = fields.nameIndex[string(key)];ok {
f = & fields.list[i]
}
if f != nil {
subv = v
for _, i: = range f.index {
subv = subv.Field(i)
}
}
if d.opcode != scanObjectKey {
panic(phasePanicMsg)
}
d.scanWhile(scanSkipSpace)
if err: = d.value(subv);err != nil {
return err
}
if d.opcode == scanEndObject {
break
}
}
return nil
}
当上述方法调用 encoding/json.decodeState.value 时,该方法会重新判断键对应的值是否是对象、数组或者字面量,因为数组和对象都是集合类型,所以该方法会递归地进行扫描,在这里就不再继续介绍这些集合类型的解析过程了,我们来简单分析一下字面量是如何被处理的:
func(d * decodeState) value(v reflect.Value) error {
switch d.opcode {
default: panic(phasePanicMsg)
case scanBeginArray:
...
case scanBeginObject:
...
case scanBeginLiteral: start: = d.readIndex()
d.rescanLiteral()
if v.IsValid() {
if err: = d.literalStore(d.data[start: d.readIndex()], v, false);
err != nil {
return err
}
}
}
return nil
}
字面量的扫描会通过 encoding/json.decodeState.rescanLiteral,该方法会依次扫描缓冲区中的字符并根据字符的不同对字符串进行切片,整个过程有点像编译器的词法分析:
func(d * decodeState) rescanLiteral() {
data, i: = d.data, d.off
Switch:
switch data[i - 1] {
case '"': // string
...
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': // number
...
case 't': // true
i += len("rue")
case 'f': // false
i += len("alse")
case 'n': // null
i += len("ull")
}
if i < len(data) {
d.opcode = stateEndValue( & d.scan, data[i])
} else {
d.opcode = scanEnd
}
d.off = i + 1
}
因为 JSON 中的字面量其实也只包含字符串、数字、布尔值和空值几种,所以该方法的实现也不会特别复杂,当该方法扫描了对应的字面量之后,会调用 encoding/json.decodeState.literalStore 字面量存储到反射类型变量所在的地址中,在这个过程中会调用反射的 reflect.Value.SetInt、reflect.Value.SetFloat 和 reflect.Value.SetBool 等方法。
9.1.4 小结
JSON 本身就是一种树形的数据结构,无论是序列化还是反序列化,都会遵循自顶向下的编码和解码过程,使用递归的方式处理 JSON 对象。作为标准库的 JSON 提供的接口非常简洁,虽然它的性能一直被开发者所诟病,但是作为框架它提供了很好的通用性,通过分析 JSON 库的实现,我们也可以从中学习到使用反射的各种方法。