這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
RawMessage類型
encoding/json的庫中有這樣一個類型:
RawMessage類型是一個保持原本編碼的json對象。本類型實現了Marshaler和Unmarshaler介面,用於延遲json的解碼或者預計算json的編碼。
實際工作中,我們可能會遇到類型這種的json資料:
package mainimport "encoding/json"// jsonText comes from http://json.org/example.htmlvar 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 glossaryjson.Unmarshal(jsonText, &g)}
寫了半天的結構體類型, 卻僅僅使用最外層的Title和 GlossDiv.Title,那麼對於這種情況我們怎麼做合適呢 ?
package mainimport "encoding/json"// jsonText comes from http://json.org/example.htmlvar 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 glossarySectionaljson.Unmarshal(jsonText, &g)}
一目瞭然, RawMessage 起到了延遲解碼一個 JSON 值的作用。
結論:
對於一些關乎效能的 JSON 解析的處理, 我們可以通過 json.RawMessage 進行效能的提升.