标签:lan class xxx odi 控制 文件 遍历 val util
我们可以直接将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数据映射到一个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标签:lan class xxx odi 控制 文件 遍历 val util
原文地址:https://www.cnblogs.com/jasonminghao/p/12379839.html