欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编码、解码

程序员文章站 2022-07-05 16:28:26
...

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