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