Go语言编程之json格式的编码和解码

       Json是一种比xml更轻量级的数据交换格式,在易于人们阅读编写的同时,也易于程序解析和生成。尽json是JavaScript的一个子集,但json采用完全独立与编程的文本格式,且表现为键值对集合的文本描述形式,这使得他称为较为理想的、跨平台、跨语言的数据交换语言。

        开发者可以用json传输简单的字符串、数字、布尔值,也可以传输一个数组,或者一个更复杂的复合结构。在web开发领域中,json被广泛应用于web服务端程序和客户端之间的数据通信。

       Go语言内建对json的支持。使用Go语言内置的encoding/json标准库,开发者可以轻松的使用Go程序生成和解析json格式的数据。

1.编码json

【1】通过结构体生成json

package main

import (
	"encoding/json"
	"fmt"
)

//成员首字母必须大写
type IT struct {
	Company  string `json: "company"` //这样格式化后Company变成company,首字母变小写
	Subjects []string
	Isok     bool
	Price    float64 `json: "-"`      //-表示不让字段输出在屏幕
	Str      bool    `json:",string"` //表示将这个字段转化为字符串输出
}

func main() {
	//定义一个结构体变量,同时初始化
	s := IT{"itcast", []string{"Go", "C++", "Python", "Test"}, true, 666.666, false}

	//编码,根据内容生成json文本
	buf1, err1 := json.Marshal(s)
	if err1 != nil {
		fmt.Println(err1)
		return
	}
	//格式化输出,有层次打印json,后两个参数分别为每一行的前缀,每一层的缩进
	buf2, err2 := json.MarshalIndent(s, "", "\t")
	if err2 != nil {
		fmt.Println(err2)
		return
	}
	fmt.Println("buf1 = ", string(buf1))
	fmt.Println("buf2 = ", string(buf2))
}

输出:

【2】通过map生成json

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	//创建一个map
	m := make(map[string]interface{}, 4)
	m["company"] = "itcast"
	m["objects"] = []string{"Go", "Python", "C++", "Test"}
	m["isok"] = true
	m["price"] = 666.666

	//编码成json
	result, err := json.MarshalIndent(m, "", "\t")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("result = ", string(result))
}

输出:

2.解码json

【1】json解析到结构体

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct {
	Company  string   `json: "company"`
	Subjects []string `json: "subjects"`
	Isok     bool     `json: "isok"`
	Price    float64  `json: "price"`
}

func main() {
	jsonBuf := `
	{
    "company": "itcast",
    "subjects": [
	    "Go",
        "Python",
        "C++",
        "Test"
    ],
	"isok": true,
    "price": 666.666
}`
	var tmp IT                                   //定义一个结构体变量
	err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
	if err != nil {
		fmt.Println(err)
		return
	}
	//fmt.Println("tmp = ", tmp)
	fmt.Printf("tmp = %+v\n", tmp)
	type IT2 struct {
		Subjects []string `json:"subjects"` //只想获取subjects中的数据
	}

	//定义结构体变量
	var tmp2 IT2
	err2 := json.Unmarshal([]byte(jsonBuf), &tmp2)
	if err2 != nil {
		fmt.Println(err2)
		return
	}
	fmt.Printf("tmp2 = %+v\n", tmp2)
}

输出:

【2】json解析到map

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct {
	Company  string   `json: "company"`
	Subjects []string `json: "subjects"`
	Isok     bool     `json: "isok"`
	Price    float64  `json: "price"`
}

func main() {
	jsonBuf := `
	{
    "company": "itcast",
    "subjects": [
	    "Go",
        "Python",
        "C++",
        "Test"
    ],
	"isok": true,
    "price": 666.666
}`
	m := make(map[string]interface{}, 4)
	err := json.Unmarshal([]byte(jsonBuf), &m)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("m = %+v\n", m)

	//类型断言
	for key, value := range m {
		switch value.(type) {
		case string:
			fmt.Printf("map[%s]的类型为string,value为%v\n", key, value)
		case bool:
			fmt.Printf("map[%s]的类型为bool,value为%v\n", key, value)
		case float64:
			fmt.Printf("map[%s]的类型为float64,value为%v\n", key, value)
		case []interface{}:
			fmt.Printf("map[%s]的类型为[]interface{},value为%v\n", key, value)
		default:
			fmt.Println("error")
		}
	}
}

输出:

猜你喜欢

转载自blog.csdn.net/random_w/article/details/84990221