zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    二进制或者其他进制转为十进制
    十进制转为二进制或者其他进制
    0.1 + 0.2 !== 0.3
    [git]删除远程分支
    [git]一个本地仓库,多个远程仓库
    [git]用户名,邮箱
    npm install命令
    常用命令:查看端口
    std::lock_guard 与 std::unique_lock
    std::mutex
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/12379839.html
Copyright © 2011-2022 走看看