Golang Json数据处理方法

Posted jasonminghao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Golang Json数据处理方法的主要内容,如果未能解决你的问题,请参考以下文章

Golang实践录:反射reflect的一些研究及代码汇总

代码片段 - Golang 实现简单的 Web 服务器

golang goroutine例子[golang并发代码片段]

golang代码片段(摘抄)

代码片段 - Golang 实现集合操作

Golang Json数据处理方法