在Go(Golang)中解析JSON文件的方法

2,283 阅读1分钟

概述

encoding/json包提供了一个Unmarshal方法,可以用来将文件字节转换成golang中的结构体或地图。

json.Unmarshal函数可以用来将JSON转换为结构体或应用程序。下面是该方法的签名

func Unmarshal(data []byte, v interface{}) error

让我们看看以下例子

  • 将JSON文件解析成一个结构体

  • JSON解析文件为地图

JSON解析文件为结构体

创建一个文件employee.json,内容如下

{"Name":"John","Age":21}

以下是代码

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
)

type employee struct {
	Name string `json:"Name"`
	Age  int    `json:"Age"`
}

func main() {

	var emp employee
	file, err := ioutil.ReadFile("employee.json")
	if err != nil {
		log.Fatalf("Some error occured while reading file. Error: %s", err)
	}
	err = json.Unmarshal([]byte(file), &emp)
	if err != nil {
		log.Fatalf("Error occured during unmarshaling. Error: %s", err.Error())
	}
	fmt.Printf("emp Struct: %#v\n", emp)
}

输出

emp Struct: main.employee{Name:"John", Age:21}

在上面的代码中,我们创建了一个雇员结构。

type employee struct {
	Name string `json:"Name"`
	Age  int    `json:"Age"`
}

employee结构有一些json元标签,用于将json转换为结构。详情请见此链接- https://golangbyexample.com/struct-field-meta-or-tags/

这就是我们如何将文件字节解压到雇员实例中的。

err = json.Unmarshal([]byte(file), &emp)

JSON解析文件为地图

需要注意的一个非常重要的问题是,map允许键值为整数,而JSON不允许键值为整数。JSON只允许键值为字符串。因此,一个键值为整数的地图在转换为JSON时将会有一个键值为字符串。

假设我们有下面的JSON

{"1":"John", "2": "Simon"}

下面的程序将读取上述内容,然后将上述json转换为map

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
)

func main() {
	a := make(map[int]string)

	file, err := ioutil.ReadFile("temp.json")
	if err != nil {
		log.Fatalf("Error occured during unmarshaling. Error: %s", err.Error())
	}
	json.Unmarshal([]byte(file), &a)

	fmt.Println(a)
}

输出

map[1:John 2:Simon]