JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。目前我们看到很多的开放平台,基本上都是采用了JSON作为他们的数据交互的接口。既然JSON在Web开发中如此重要,那么Go语言对JSON支持的怎么样呢?Go语言的标准库已经非常好的支持了JSON,可以很容易的对JSON数据进行编、解码的工作。
简单的说 json很适合用于网络数据传输,go语言对json的支持很好
func Marshal(v interface{}) ([]byte, error)
将任意类型的数据转成byte[] 类型
结构体转JSON
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
//自定义字段名
Name string `json:"name"`
//Age不会导出到JSON
Age int `json:"-"`
//如果Rmb为空 则不会输出到JSON
Rmb float64 `json:"rmb,omitempty"`
//开头字母小写 不会输出到JSON
sex bool
Hobby []string
}
func main() {
person := Person{"于谦", 50, 123.22, true, []string{"eat", "drink"}}
marshal, err := json.Marshal(person)
if err != nil {
fmt.Println("序列化失败,err=", err)
return
}
fmt.Println(string(marshal))
}
// 打印结果
//{"name":"于谦","rmb":123.22,"Hobby":["eat","drink"]}
map转JSON
package main
import (
"encoding/json"
"fmt"
)
func main() {
dataMap := make(map[string]interface{})
dataMap["name"] = "于谦"
dataMap["age"] = 50
dataMap["rmb"] = 2314.14
dataMap["sex"] = true
dataMap["hobby"] = []string{"eat", "drink"}
bytes, err := json.Marshal(dataMap)
if err != nil {
fmt.Println("序列化失败,err=", err)
return
}
fmt.Println(string(bytes))
}
//打印结果
//{"age":50,"hobby":["eat","drink"],"name":"于谦","rmb":2314.14,"sex":true}
func Unmarshal(data []byte, v interface{}) error
JSON转结构体
网站生成接收的结构体 https://oktools.net/json2go
package main
import (
"encoding/json"
"fmt"
)
// Person 同理 字段名开头字母大写才能接受
//JSON解析的时候只会解析能找得到的字段,找不到的字段会被忽略,
//当你接收到一个很大的JSON数据结构而你却只想获取其中的部分数据的时候,你只需将你想要的数据对应的字段名大写,即可轻松解决这个问题
type Person struct {
Name string
Age int
Rmb float64
Sex bool
Hobby []string
}
func main() {
jsonStr := `{"Name":"于谦","Age":50,"Rmb":123.22,"Sex":true,"Hobby":["eat","drink"]}`
JsonBytes := []byte(jsonStr)
p := new(Person)
err := json.Unmarshal(JsonBytes, &p)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(*p)
}
JSON转map
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"Name":"于谦","Age":50,"Rmb":123.22,"Sex":true,"Hobby":["eat","drink"]}`
JsonBytes := []byte(jsonStr)
dataMap := make(map[string]interface{})
err := json.Unmarshal(JsonBytes, &dataMap)
if err != nil {
fmt.Println("err=", err)
return
}
fmt.Println(dataMap)
}
map对于JSON的接收和生成方式都比较单一,但是万能