前端开发
515
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 进行性能的提升.