您的位置:首页 > Web前端 > JavaScript

Golang解析json数据之延迟解码

2018-04-18 10:51 543 查看

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 进行性能的提升.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  golang json延迟解析