如何在 Golang 中解析 JSON 文件?


假设我们想要在 **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 的一种非常简单的方法是使用 **非结构化方法**。在非结构化方法中,我们使用 **interfaces{}** 读取 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

更新于: 2022-02-21

9K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.