JavaScript 对象表示法是一种用于存储和交换数据的格式,这是一种人类能够理解的纯文本格式。JSON可以以键值对的方式表示数据,也可以以数组的方式表示数据。从很大程度上说它已经取代可扩展的标记语言XML。
Go标准库中提供了encoding/json包,用于编码和解码JSON数据。
函数Marshal将Go数据编码为JSON。
jsonByteData, err = json.Marshall(p)
在JSON数据中,所有的键名都是以小写字母大头。因此我们对结构体中的数据字段指定标签,对于带JSON标签的数据,将使用标签中的数据替换。
package main
import (
"encoding/json"
"fmt"
"log"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Hobbies []string `json:"hobbies"`
}
func main() {
hobbies := []string{"Cycling", "Chees", "Techno"}
p := Person{
Name: "G",
Age: 2,
Hobbies: hobbies,
}
fmt.Printf("%+v\n", p)
jsonByteData, err := json.Marshal(p)
if err != nil{
log.Fatal(err)
}
jsonStringData := string((jsonByteData))
fmt.Println(jsonStringData)
}
在JSON键名后面加上omitempty用于在编码为JSON时忽略结构体中的空字段。如果不写,结构体中的空字段将被设定为零值。
type Person struct {
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Hobbies []string `json:"hobbies,omitempty"`
}
函数Unmarshal接受一个字节切片以及一个指定要将数据解码为何种格式的接口。该函数将JSON字符串转换为结构体实例。
package main
import (
"encoding/json"
"fmt"
"log"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Hobbies []string `json:"hobbies"`
}
func main() {
jsonStringData := `{"name":"GE","age":44,"hobbies":["Cys","Che","Y"]}`
jsonByteData := []byte(jsonStringData) //JSON字符串数据转换为字节切片
p := Person{} //定义结构体来告诉解码器将键映射到的字段
err := json.Unmarshal(jsonByteData, &p)
if err != nil{
log.Fatal(err)
}
fmt.Printf("%+v\n", p)
}
JavaScript是一种弱类型语言,即不显式的声明变量的数据类型。而Go是强类型的。所以在创建用于编码和解码JSON的结构体时,必须对上述数据类型的对应关系做到心中有数,如果数据类型不匹配,encoding/json包将会引发错误。
JSON | Go |
Boolean | bool |
Number | float64 |
String | string |
Array | []interface{} |
Object | map[string]interface{} |
Null | nil |
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)