RawMessage类型
encoding/json的库中有这样一个类型:
RawMessage类型是一个保持原本编码的json对象。本类型实现了Marshaler和Unmarshaler接口,用于延迟json的解码或者预计算json的编码。
实际工作中,我们可能会遇到类型这种的json数据:
package main
import "encoding/json"
// jsonText comes from http://json.org/example.html
var jsonText = []byte(`
{
"glossary":{
"title":"example glossary",
"GlossDiv":{
"title":"S",
"GlossList":{
"GlossEntry":{
"ID":"SGML",
"SortAs":"SGML",
"GlossTerm":"Standard Generalized Markup Language",
"Acronym":"SGML",
"Abbrev":"ISO 8879:1986",
"GlossDef":{
"para":"A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso":[
"GML",
"XML"
]
},
"GlossSee":"markup"
}
}
}
}
}`)
type glossary struct {
Glossary struct {
Title string `json:"title"`
GlossDiv struct {
Title string `json:"title"`
GlossList struct {
GlossEntry struct {
ID string `json:"ID"`
SortAs string `json:"SortAs"`
GlossTerm string `json:"GlossTerm"`
Acronym string `json:"Acronym"`
Abbrev string `json:"Abbrev"`
GlossDef struct {
Para string `json:"para"`
GlossSeeAlso []string `json:"GlossSeeAlso"`
} `json:"GlossDef"`
GlossSee string `json:"GlossSee"`
} `json:"GlossEntry"`
} `json:"GlossList"`
} `json:"GlossDiv"`
} `json:"glossary"`
}
func main() {
var g glossary
json.Unmarshal(jsonText, &g)
}
写了半天的结构体类型, 却仅仅使用最外层的Title和 GlossDiv.Title,那么对于这种情况我们怎么做合适呢 ?
package main
import "encoding/json"
// jsonText comes from http://json.org/example.html
var jsonText = []byte(`
{
... // 此处省略, 同上
}`)
type glossarySectional struct {
Glossary struct {
Title string `json:"title"`
GlossDiv struct {
Title string `json:"title"`
GlossList json.RawMessage `json:"GlossList"` // diff: delay JSON decoding
} `json:"GlossDiv"`
} `json:"glossary"`
}
func main() {
var g glossarySectional
json.Unmarshal(jsonText, &g)
}
一目了然, RawMessage 起到了延迟解码一个 JSON 值的作用。
结论:
对于一些关乎性能的 JSON 解析的处理, 我们可以通过 json.RawMessage 进行性能的提升.