Go | 关于json.RawMessage

392 阅读1分钟

话不多说,线上原版介绍:↓

RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding.

1、如何理解 delay JSON decodingprecompute a JSON encoding
因为解码时用到的json本质上就是[]byteRawMessage实际类型也是[]byte,所以在解码时遍历到该字段就直接赋值即可;同理,编码也是直接填充json的过程。

备注:这里隐含一个约定,在编解码的时候,会检查要编解码的字段是否实现了Mashaler、Unmarshaler接口,如果实现了就会调用对应的方法进行编解码。所以其实完全可以自定义一个类型[]byte,并且实现对应的接口就行)
对于某些情况需要用一个字段来表示不同类型的情况时,比如:
定义一个上传文件的结构体,里面包含类型和具体的文件结构体,有两种实现方式:

  • 第一种上传类型少的话还好,但是类型变多或者未来有新的类型时,都需要调整结构体
  • 第二种实现方式就可以解决这个问题
第一种实现方式:
type UpLoadObject struct {
   Type   string
   Video  MP4
   Jpg    Jpg
}
第二种实现方式:
type UpLoadObject struct {
   Type   string
   Object json.RawMessage
}

type MP4 struct {
   Time int
}

type Jpg struct {
   Wide  int
   Hight int
}

当然对于第二种方式,实际上解码时并没有对Object字段处理,当我们需要该字段时,再根据Type字段解码,这也就是所谓的delay JSON decoding
当编码时因为它本身就是[]byte,所以就相当于precompute a JSON encoding了!