json数据处理方法一
我们可以直接将json数据映射到预定义好的结构体中,但是必须要确保json的字段和结构体必须要一致
假设我们有如下data.json文件:
{
"group":"1012",
"info":[
{
"name":"Jack",
"hobby":"basketball"
},
{
"name":"Xander",
"hobby":"running"
},
{
"name":"Eric",
"hobby":"running"
}
]
}
代码示例:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type (
studentInfo struct {
Name string `json:"name"`
Hobby string `json:"hobby"`
}
class struct {
Group string `json:"group"`
Info []studentInfo `json:"info"`
}
)
func main(){
var data class
// 读取json文件内容 返回字节切片
bytes,_ := ioutil.ReadFile("data.json")
// 将字节切片映射到指定结构体上
json.Unmarshal(bytes,&data)
// 打印对象结构
fmt.Println(data)
// 循环所有学生的信息
for idx,val := range data.Info{
fmt.Printf("index: %v 学生名:%v,爱好: %v\n",idx,val.Name,val.Hobby)
}
// 更改值
data.Group = "1013"
}
运行该程序后,控制台打印如下信息:
{1012 [{Jack basketball} {Xander running} {Eric running}]}
index: 0 学生名:Jack,爱好: basketball
index: 1 学生名:Xander,爱好: running
index: 2 学生名:Eric,爱好: running
json数据处理方式二
但是有的时候,如果JSON数据的定义过于复杂化,我们就很需要一种灵活的方式来处理,在这种情况下,可以将JSON数据映射到一个map
结构中
假设我们有如下data.json文件:
[
"class":{
"name":"1013",
"teacher":"Mora"
},
"info":[
{
"name":"Jack",
"hobby":"basketball"
},
{
"name":"Xander",
"hobby":"running"
},
{
"name":"Eric",
"hobby":"running"
}
]
]
代码示例:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
func main(){
// 读取json文件内容 返回字节切片
bytes,_ := ioutil.ReadFile("data.json")
// 将字节切片映射到指定map上
// key:string类型,value:interface{} 类型能存任何数据类型
var jsonObj map[string]interface{}
json.Unmarshal(bytes,&jsonObj)
// 将key:info 转换为[]interface{}类型(必须先转换成该类型才能实现range操作)
stu := jsonObj["info"].([]interface{})
// 打印对象结构
fmt.Println(jsonObj)
// 打印所有学生信息
for idx,item := range stu {
// 同样,遍历的时候也需要做转换
x := item.(map[string]interface{})
// 更改名字
//x["name"] = string("xxx")
fmt.Println(idx,x["name"])
}
}
运行该程序后,控制台打印如下信息:
map[group:1012 info:[map[hobby:basketball name:Jack] map[hobby:running name:Xander] map[hobby:running name:Eric]]]
0 Jack
1 Xander
2 Eric