假设我们想在 Go 中读取一个JSON文件 。 我们所说的读取,是指我们想把文件数据转换成 Go 中的 结构 。
考虑下图所示的JSON文件,我们将用它来读取,然后将数据转换为结构。
{
"users": [
{
"name": "Mukul Latiyan",
"social": {
"facebook": "https://facebook.com/immukul",
"twitter": "https://twitter.com/immukul",
"linkedin": "https://linkedin.com/immukul"
}
},
{
"name": "Mayank",
"social": {
"facebook": "https://facebook.com/mayank101",
"twitter": "https://twitter.com/mayank101",
"linkedin": "https://linkedin.com/mayank101"
}
},
{
"name": "Deepak",
"social": {
"facebook": "https://facebook.com/deepak1",
"twitter": "https://twitter.com/deepak1",
"linkedin": "https://linkedin.com/deepak1"
}
}
]
}
上述JSON文件应该以 users.json 的名字保存 。 它包含了不同的用户,每个用户都有一个名字和不同的社交领域。
在Golang中读取上述JSON的一个非常幼稚的方法是利用 非结构化的方法。 在非结构化的方法中,我们使用 接口{} 来读取JSON数据。
考虑一下下面的代码,它将使我们能够读取 users.json 文件。
例子1
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
)
func main() {
fileContent, err := os.Open("users.json")
if err != nil {
log.Fatal(err)
return
}
fmt.Println("The File is opened successfully...")
defer fileContent.Close()
byteResult, _ := ioutil.ReadAll(fileContent)
var res map[string]interface{}
json.Unmarshal([]byte(byteResult), &res)
fmt.Println(res["users"])
}
输出
如果我们在上述代码上运行命令 go run main.go ,那么我们将在终端得到以下输出。
The File is opened successfully...
[map[name:Mukul Latiyan
social:map[facebook:https://facebook.com/immukul
linkedin:https://linkedin.com/immukul
twitter:https://twitter.com/immukul]] map[name:Mayank
social:map[facebook:https://facebook.com/mayank101
linkedin:https://linkedin.com/mayank101
twitter:https://twitter.com/mayank101]] map[name:Deepak
social:map[facebook:https://facebook.com/deepak1
linkedin:https://linkedin.com/deepak1
twitter:https://twitter.com/deepak1]]]
下一步是创建将容纳JSON数据的 结构 。考虑一下下面提到的 结构 。
type Users struct {
Users []User `json:"users"`
}
type User struct {
Name string `json:"name"`
Social Social `json:"social"`
}
type Social struct {
Facebook string `json:"facebook"`
Twitter string `json:"twitter"`
LinkedIn string `json:"linkedin"`
}
最后一步是利用 json.Unmarshal() 函数。
例2
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
)
type Users struct {
Users []User `json:"users"`
}
type User struct {
Name string `json:"name"`
Social Social `json:"social"`
}
type Social struct {
Facebook string `json:"facebook"`
Twitter string `json:"twitter"`
LinkedIn string `json:"linkedin"`
}
func main() {
fileContent, err := os.Open("users.json")
if err != nil {
log.Fatal(err)
return
}
fmt.Println("The File is opened successfully...")
defer fileContent.Close()
byteResult, _ := ioutil.ReadAll(fileContent)
var users Users
json.Unmarshal(byteResult, &users)
for i := 0; i < len(users.Users); i++ {
fmt.Println("User Name: " + users.Users[i].Name)
fmt.Println("Facebook Url: " + users.Users[i].Social.LinkedIn)
}
}
输出
如果我们在上述代码上运行命令go run main.go ,那么我们将在终端得到以下输出。
The File is opened successfully...
User Name: Mukul Latiyan
Facebook Url: <https://linkedin.com/immukul>
User Name: Mayank
Facebook Url: https://linkedin.com/mayank101
User Name: Deepak
Facebook Url: https://linkedin.com/deepak1