- A+
一、json说明
JSON是JavaScript Object Notation的缩写,它是一种数据交换格式。
在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上交换数据。XML本身不算复杂,但是,加上DTD、XSD、XPath、XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范。
终于,在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)同学为了拯救深陷水深火热同时又被某几个巨型软件企业长期愚弄的软件工程师,发明了JSON这种超轻量级的数据交换格式。
道格拉斯同学长期担任雅虎的高级架构师,自然钟情于JavaScript。他设计的JSON实际上是JavaScript的一个子集。在JSON中,一共就这么几种数据类型:
number:和JavaScript的number完全一致;
boolean:就是JavaScript的true或false;
string:就是JavaScript的string;
null:就是JavaScript的null;
array:就是JavaScript的Array表示方式——[];
object:就是JavaScript的{ ... }表示方式。
以及上面的任意组合。
并且,JSON还定死了字符集必须是UTF-8,表示多语言就没有问题了。为了统一解析,JSON的字符串规定必须用双引号"",Object的键也必须用双引号""。
由于JSON非常简单,很快就风靡Web世界,并且成为ECMA标准。几乎所有编程语言都有解析JSON的库。
二、Go语言中的json使用
导入json包
import "encoding/json"
golang使用json序列化与反序列化结构体示例:
1.序列化结构体
type User struct { // 定义结构体
UserName string `json:"username"` // tag使用(在json序列化时,UserName字段序列化为username)
NickName string `json:"nickname"`
Age int
Birthday string
Sex string
Email string
}
func testStruct() {
user1 := &User { // 初始化结构体
UserName: "Dream Person",
NickName: "Dream",
Birthday: "2008/8/8",
Age: 18,
Sex: "男",
Email: "zmr@dream.com",
}
data, err := json.Marshal(user1) // 序列化user1结构体,有两个返回值,一个是序列化后的数据另一个是错误
if err != nil { // 判断错误
fmt.Println("json.Marshal err:",err)
return
}
fmt.Println(data) // 打印序列化后的数据,结果为:{"username":"Dream Person","nickname":"Dream","Age":18,"Birthday":"2008/8/8","Sex":"男","Email":"zmr@dream.com"}
}
2.反序列化结构体
package main
import(
"fmt"
"encoding/json"
)
// 获取struct类型的字符串
type User struct { // 定义结构体
UserName string `json:"username"` // tag使用(在json序列化时,UserName字段序列化为username)
NickName string `json:"nickname"`
Age int
Birthday string
Sex string
Email string
}
func testStruct() (ret string, err error) {
user1 := &User { // 初始化结构体
UserName: "Dream Person",
NickName: "Dream",
Birthday: "2008/8/8",
Age: 18,
Sex: "男",
Email: "zmr@dream.com",
}
data, err := json.Marshal(user1) // 序列化user1结构体,有两个返回值,一个是序列化后的数据另一个是错误
if err != nil { // 判断错误
fmt.Println("json.Marshal err:",err)
return
}
ret = string(data) // 返回字符串类型的数据
return
}
// json反序列化struct类型
func test() {
data, err := testStruct() // 获取字符串类型的数据
if err != nil {
fmt.Println("test struct error:",err)
}
var user1 User // 定义User类型的变量user1
err = json.Unmarshal([]byte(data),&user1) // 反序列化:json.Unmarshal(将要反序列化的数据转换为byte类型,反序列化后的数据通过地址赋值给变量user1)
if err != nil {
fmt.Printf("Unmarshal failed",err)
return
}
fmt.Println("json data:",user1) // 打印反序列化后的数据,结果为:json data: {Dream Person Dream 18 2008/8/8 男 zmr@dream.com}
fmt.Printf("%T\n",user1) // 类型为:main.User
}
Golang序列化与反序列化map
1.序列化map
func mapJson() {
var m map[string]interface{} // 定义map变量
m = make(map[string]interface{}) // 初始化
m["username"] = "user1" // 赋值
m["age"] = 19
m["sex"] = "男"
data, err := json.Marshal(m) // 序列化
if err != nil { // 错误判断
fmt.Println("json.Marshal err:",err)
return
}
fmt.Printf("%s",string(data)) // 结果为:{"age":19,"sex":"男","username":"user1"}
}
2.反序列化map
// 获取map类型的数据
func mapJson() (ret string, err error) {
var m map[string]interface{} // 定义map类型变量
m = make(map[string]interface{}) // 初始化
m["username"] = "user1" // 赋值
m["age"] = 19
m["sex"] = "男"
data, err := json.Marshal(m) // 序列化
if err != nil {
err = fmt.Errorf("json.Marshal err:",err)
return
}
ret = string(data) // 返回字符串类型数据
return
}
// 反序列化map
func test2() {
data, err := mapJson() // 获取数据
if err != nil { // 判断错误
fmt.Println("test map failed", err)
return
}
var m map[string]interface{} // 定义变量
m = make(map[string]interface{})
err = json.Unmarshal([]byte(data),&m) // 反序列化
if err != nil {
fmt.Println("Unmarshal failed",err)
return
}
fmt.Println(m) // 打印反序列化后的数据,结果为:map[age:19 sex:男 username:user1]
fmt.Printf("%T\n",m) // 类型为:map[string]interface {}
}