1. json简介
JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成。尽管JSON是JavaScript的一个子集,但JSON采用完全独立于编程语言的文本格式,且表现为键/值对集合的文本描述形式(类似一些编程语言中的字典结构),这使它成为较为理想的、跨平台、跨语言的数据交换语言。
开发者可以用 JSON 传输简单的字符串、数字、布尔值,也可以传输一个数组,或者一个更复杂的复合结构。在 Web 开发领域中, JSON被广泛应用于 Web 服务端程序和客户端之间的数据通信。
Go语言内建对JSON的支持。使用Go语言内置的encoding/json 标准库,开发者可以轻松使用Go程序生成和解析JSON格式的数据。
JSON官方网站:http://www.json.org/
在线格式化:http://www.json.cn/
2. json编码
使用json.Marshal()函数可以对一组数据进行JSON格式的编码。
func Marshal(v interface{}) ([]byte, error)
MarshalIndent 很像 Marshal,只是用缩进对输出进行格式化
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
package main
import (
"encoding/json"
"fmt"
)
type IT struct{
Name string
Company string
Subjects []string
IsOk bool
Price float64
}
func main()
t1 := IT{"Ternence Hsu","Google", []string{"Go", "C++", "Python", "Test"}, true,666.666}
//生成一段JSON 格式的文本
//如果编码成功, err 将赋于零值 nil,变量b 将会是一个进行JSON 格式化之后的[]byte 类型
b1, err := json.Marshal(t1)
if err != nil {
fmt.Println("json err:", err)
}
// 用缩进对输出进行格式化
b2, err := json.MarshalIndent(t1, "", " ")
if err != nil {
fmt.Println("json err:", err)
}
fmt.Println(string(b1))
fmt.Println(string(b2))
}
/*
b1输出结果:
{"Name":"Ternence Hsu","Company":"Google","Subjects":["Go","C++","Python","Test"],"IsOk":true,"Price":666.666}
b2 输出结果:
{
"Name":"Ternence Hsu",
"Company":"Google",
"Subjects":[
"Go",
"C++",
"Python",
"Test"
],
"IsOk":true,
"Price":666.666
}
*/
3. json解码
使用json.Unmarshal()函数将JSON格式的文本解码为Go里面预期的数据结构
func Unmarshal(data []byte, v interface{}) error
package main
import (
"encoding/json"
"fmt"
)
type IT struct {
Name string `json:"name"`
Company string `json:"company"`
Subjects []string `json:"subjects"`
IsOk bool `json:"isok"`
Price float64 `json:"price"`
}
func main() {
b := []byte(`{
"name": "Ternence Hsu",
"company": "Google",
"subjects": [
"Go",
"C++",
"Python",
"Test"
],
"isok": true,
"price": 666.666
}`)
var t IT
err := json.Unmarshal(b, &t)
if err != nil {
fmt.Println("json err:", err)
}
fmt.Println(t)
//运行结果:{Ternence Hsu Google [Go C++ Python Test] true 666.666}
//只想要Subjects字段
type IT2 struct {
Subjects []string `json:"subjects"`
}
var t2 IT2
err = json.Unmarshal(b, &t2)
if err != nil {
fmt.Println("json err:", err)
}
fmt.Println(t2)
//运行结果:{[Go C++ Python Test]}
}