导读 | json的全称是Javascript object notation, 中文全称:js对象表示法。在序列化和反序列化的协议中,有:json、xml、yaml、protocol buffer等。其中json是前后端API契约数据的主要传输形式。json支持数值、布尔值、数组和对象四种数据类型。通过这四种数据类型,可以构建复杂的数据模型。 |
在Go语言中,我们可以使用json标准库来实现数据的序列化和反序列化。这个库提供了方便的方法来序列化和反序列化map、结构体、数组、切片和内置的基本数据类型。通过使用json标准库,我们可以轻松地将数据转换为json格式,并在需要时将其解析回原始数据类型。这为我们处理数据提供了很大的便利性。
在这里,我将举三个例子来说明json的使用方法。对于初学者来说,可能经常只使用一种结构体对象来接收和发送数据。下面我们就来看看具体的例子。 1. 使用结构体对象接收数据: ``` type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { data := `{"name": "Alice", "age": 25}` var p Person err := json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("解析json失败:", err) return
结构体type Person struct {<br>
Name string `json:"name"`<br>
Age int `json:"age"`<br>
}
<br>
func main() {<br>
var (<br>
newPer Person<br>
bts []byte<br>
)<br>
per:=Person{<br>
Name: "Lily",<br>
Age: 29,<br>
}<br>
// 序列化<br>
if bts, err = json.Marshal(per); err !=nil{<br>
log.Fatal(err.Error())<br>
return<br>
}
<br>
if err = json.Unmarshal(bts, &newPer); err !=nil{<br>
log.Fatal(err.Error())<br>
return<br>
}<br>
fmt.Println(newPer)<br>
}
func main() {<br>
var (<br>
smap = map[string]int{<br>
"Age": 28,<br>
"Sex": 1,<br>
"Floor": 12,<br>
}<br>
newSmap = make(map[string]int)<br>
bts []byte<br>
)<br>
if bts, err = json.Marshal(smap); err !=nil {<br>
log.Fatal(err.Error())<br>
return<br>
}<br>
if err = json.Umarshal(bts, &newSmap); err !=nil {<br>
log.Fatal(err.Error())<br>
return<br>
}<br>
fmt.Println(newSmap)<br>
}
func main() {<br>
var (<br>
ages []int = []int{23, 20, 28, 25, 30}<br>
bts []byte<br>
err error<br>
newAges = make([]int, len(ages))<br>
)<br>
if bts, err = json.Marshal(ages); err != nil {<br>
fmt.Println(err.Error())<br>
return<br>
}<br>
if err = json.Unmarshal(bts, &newAges); err != nil {<br>
fmt.Println(err.Error())<br>
return<br>
}<br>
fmt.Println("new ages: ", newAges)<br>
return<br>
}
初学者对结构体的json序列化和反序列化比较清楚,对后两种可能很少用,也不会用。
这里还要说明一个结构体时,有时候我会用到的特性,结构体的json支持的标签值特性omitempty,例如:
type Person struct {<br>
Name string `json:"name,omitempty"`<br>
Age int `json:"age"`<br>
}<br>
它表示,当函数omitempty的标签值时,它所对应的结构体的数据元素值如果是零值,则它不会输出。那就是说如果服务端返回的结构体数据中的某个元素为空时,不返回给前端这个元素,就可以使用omitempty的json标签值属性。
在这里给大家提供一个滴滴公司的一位高级工程师taowen写的json解析库,世界上最快的。github地址:jsoniter。
以上是json数据的序列化和反序列化的详细内容。更多信息请关注PHP中文网其他相关文章!