概述
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]