在今天,JSON远比XML流行。这主要原因是因为与XML相比,使用JSON所处理的标签更少。而这就意味着网络传输时每个消息的数据更少,从而提升整个系统的性能。而且,JSON可以转化为BSON(Binary JavaScript Object Notation,二进制JavaScript对象标记),进一步缩小每个消息的数据长度。
1、解码JSON
(1)、使用 json 包的 NewDecoder 函数以及 Decode 方法进行解码。
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
type (
gResult struct {
GsearchResultClass string `json:"GsearchResultClass"`
UnescapedURL string `json:"unescapedUrl"`
URL string `json:"url"`
VisibleURL string `json:"visibleUrl"`
CacheURL string `json:"cacheUrl"`
Title string `json:"title"`
TitleNoFormatting string `json:"titleNoFormatting"`
Content string `json:"content"`
}
gResponse struct {
ResponseData struct{
Results []gResult `json:"results"`
} `json:"responseData"`
}
)
func main() {
uri := "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=8&q=golang"
resp, err := http.Get(uri)
if err != nil {
log.Println("ERRORS: ", err)
return
}
defer resp.Body.Close()
var g gResponse
err = json.NewDecoder(resp.Body).Decode(&g)
if err != nil {
log.Println("ERRORS: ",err)
return
}
fmt.Println(g)
}
(2)、使用 json 包的 Unmarshal 函数反序列化处理
有时,需要处理的JSON文档会以 string 的形式存在。在这种情况下,需要将 string 转化为 byte 切片 ([]byte),并使用 json 包的 Unmarshal 函数进行反序列化的处理。
package main
import (
"encoding/json"
"fmt"
"log"
)
type Contact struct {
Name string `json:"name"`
Title string `json:"title"`
Contact struct{
Home string `json:"home"`
Cell string `json:"cell"`
} `json:"Contact"`
}
var JSON = `{
"name": "Gopher",
"title": "programmer",
"contact": {
"home": "415.333.3333",
"cell": "415.555.5555"
}
}`
func main() {
var c Contact
err := json.Unmarshal([]byte(JSON), &c)
if err != nil {
log.Println("ERRORS: ", err)
return
}
fmt.Println(c)
}
(3)、将 json 解码到一个 map 变量中
有时,无法为 JSON 的格式声明一个结构类型,而是需要更加灵活的方式来处理 JSON 文档。在这种情况下,可以将JSON 文档解码到一个 map 变量中。
package main
import (
"encoding/json"
"fmt"
)
type Contact struct {
Name string `json:"name"`
Title string `json:"title"`
Contact struct{
Home string `json:"home"`
Cell string `json:"cell"`
} `json:"Contact"`
}
var JSON = `{
"name": "Gopher",
"title": "programmer",
"contact": {
"home": "415.333.3333",
"cell": "415.555.5555"
}
}`
func main() {
var c map[string]interface{}
err := json.Unmarshal([]byte(JSON), &c)
if err != nil {
fmt.Println("ERRORS: ", err)
return
}
fmt.Println(c["name"])
fmt.Println(c["title"])
fmt.Println("contact")
fmt.Println(c["contact"].(map[string]interface{})["home"])
fmt.Println(c["contact"].(map[string]interface{})["cell"])
fmt.Println(c)
}
2、编码 JSON
使用 json 包的 MarshalIndent 函数可以进行 json 的编码。这个函数可以很方便地将 Go 语言的map 类型的值或者结构类型的值转换为易读格式的JSON文件。序列化是指将数据转换为JSON字符串的过程。
package main
import (
"encoding/json"
"fmt"
"log"
)
func main() {
c := make(map[string]interface{})
c["name"] = "Gopher"
c["title"] = "programe"
c["contact"] = map[string]interface{}{
"home": "415.333.33333",
"cell": "415.555.55555",
}
data, err := json.MarshalIndent(c, "", " ")
if err != nil {
log.Println("ERROR:", err)
return
}
fmt.Println(string(data))
}
func MarshalIndent(v interface{}, prefix, indent string)([] byte, error) { }
MarshalIndent 函数使用缩进的的形式对数据进行json 序列化处理。prefix:指的是前缀, indent:指的是缩进。