编码、解码

在今天,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:指的是缩进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值