我们可以直接将json数据映射到预定义好的结构体中,但是必须要确保json的字段和结构体必须要一致
假设我们有如下data.json文件:
{ "group":"1012", "info":[ { "name":"Jack", "hobby":"basketball" }, { "name":"Xander", "hobby":"running" }, { "name":"Eric", "hobby":"running" } ]}
代码示例:
package mainimport ( "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,爱好: basketballindex: 1 学生名:Xander,爱好: runningindex: 2 学生名:Eric,爱好: running
但是有的时候,如果JSON数据的定义过于复杂化,我们就很需要一种灵活的方式来处理,在这种情况下,可以将JSON数据映射到一个map
结构中
假设我们有如下data.json文件:
[ "class":{ "name":"1013", "teacher":"Mora" }, "info":[ { "name":"Jack", "hobby":"basketball" }, { "name":"Xander", "hobby":"running" }, { "name":"Eric", "hobby":"running" } ]]
代码示例:
package mainimport ( "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 Jack1 Xander2 Eric