Golang Json数据处理方法

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
",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
原文地址:https://www.cnblogs.com/jasonminghao/p/12379839.html