3.3 json 处理
需要引入”encoding/json”包
json解析到map
jsonStr := "{\"a\":\"test\",\"b\":\"testb\"}"
var dat map[string]string
err := json.Unmarshal([]byte(jsonStr), &dat)
if err == nil {
fmt.Println(dat)
}
结果:
map[a:test b:testb]
json解析到数组
jsonStr := "[\"test\",\"testb\"]"
var dat []string
err := json.Unmarshal([]byte(jsonStr), &dat)
if err == nil {
fmt.Println(dat)
}
json 解析到结构体
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
//结构也是一种类型
Name string //定义struct的属性
Age int
}
func main() {
var person Person
jsonStr := "{\"Name\":\"test\",\"Age\":19}"
if err := json.Unmarshal([]byte(jsonStr), &person); err == nil {
fmt.Println(person)
}
}
结果:
{test 19}
interface{}
如果不想用结构体,怎么办,如api接收过来的参数,不确定json串里面有什么数据类型,可通过interface{}实现
示例:
package main
import (
"encoding/json"
"fmt"
)
func main() {
var data map[string]interface{}
jsonStr := "{\"Name\":\"test\",\"Age\":19,\"infos\":[{\"info1\":\"hello\"},{\"info2\":\"hello\"}],\"pic\":{\"pic1\":\"img.jpg\"}}"
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println(err)
}
fmt.Println(data)
for _,value:=range data{
switch value.(type) {
case float64:
fmt.Println(value)
case string:
fmt.Println(value)
case []interface {}:
for k,v:=range value.([]interface {}){
fmt.Println(k,v)
}
case map[string]interface {}:
for k,v:=range value.(map[string]interface {}){
fmt.Println(k,v)
}
}
}
}
输出结果:
map[infos:map[info:hello] Name:test Age:19]
将数组或结构体转成json
package main
import (
"encoding/json"
"fmt"
)
func main() {
arr := []string{"aaa", "bbb", "ccc"}
data, err := json.Marshal(arr)
if err == nil {
//data是[]byte类型,转化成string类型便于查看
fmt.Println(string(data))
}
}
小结:
1、用interface{}需要注意, JSON 里的数字默认都会转成 Golang 的 float64 类型,字符是string,使用方式为
fmt.Println(data["Name"].(string))
fmt.Println(data["Age"].(float64))
float64转其他类型,可参考:类型转换
2、golang 里json不是字符串而是 []byte类型,如果想用字符串可以用string()转。