Golang:读取JSON文件方法

6,304 阅读3分钟

JSON(Javascript Object Notation)是一种广泛使用的数据表示格式。由于其易于阅读的格式,开发人员经常使用JSON文件来表示重要的配置/环境变量。

除此之外,大多数RESTful APIs都会返回以JSON格式编码的数据,所以知道如何处理这些数据在现实世界的应用中也是非常有用的。

在本教程中,我们将研究如何使用Go从JSON文件中提取信息!

从JSON文件中读取结构化数据

在之前的教程中,我们看到了如何使用标准库中的encoding/json 包来处理JSON样本数据。

我们可以扩展这种方法,在JSON文件上使用同样的编码器/解码器。然而,由于我们需要从一个文件中读取,我们也可以使用io/ioutil 包。

让我们假设一个简单的文件config.json ,其内容如下。

{
    "origin": "golangdocs.com",
    "user": "Vijay",
    "active": true
}

现在让我们从这个config.json 文件中提取JSON数据。

// main.go
package main

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

// The data struct for the decoded data
// Notice that all fields must be exportable!
type Data struct {
    Origin string
    User   string
    Active bool
}

func main() {
    // Let's first read the `config.json` file
    content, err := ioutil.ReadFile("./config.json")
    if err != nil {
        log.Fatal("Error when opening file: ", err)
    }

    // Now let's unmarshall the data into `payload`
    var payload Data
    err = json.Unmarshal(content, &payload)
    if err != nil {
        log.Fatal("Error during Unmarshal(): ", err)
    }

    // Let's print the unmarshalled data!
    log.Printf("origin: %s\n", payload.Origin)
    log.Printf("user: %s\n", payload.User)
    log.Printf("status: %t\n", payload.Active)
}

你应该得到下面的输出,在创建之后config.json.

输出样本

2021/02/07 16:53:53 origin: golangdocs.com
2021/02/07 16:53:53 user: Vijay
2021/02/07 16:53:53 status: true

看上去很简单,但如果你是一个新手,你必须对一件事有所注意。

Golang 在struct 数据类型和函数中有一个 "导出 "字段的概念,所以这基本上意味着这些导出的字段是将在不同的包中可见的。由于json unmarshal函数是外部的,它只能看到可导出的字段。

要使一个字段可被导出,只需确保你将其大写即可!这就是为什么它是。这就是为什么是Origin,UserActive ,而不是origin,useractive

从JSON文件中读取非结构化的数据

如果我们的config.json 文件的内容经常变化,通过反复修改struct 字段来跟踪这些变化实际上是不可能的。

为了简化这个问题,我们可以使用将任意数据编码为interface 的概念。我们可以通过将JSON结构可视化为一个键值映射来复制它。

这里,键将是一个string ,而值可以是任何interface{}

所以我们可以简单地将Data 结构修改为map[string]interface{}!

// main.go
package main

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

func main() {
    // Let's first read the `config.json` file
    content, err := ioutil.ReadFile("./config.json")
    if err != nil {
        log.Fatal("Error when opening file: ", err)
    }

    // Now let's unmarshall the data into `payload`
    var payload map[string]interface{}
    err = json.Unmarshal(content, &payload)
    if err != nil {
        log.Fatal("Error during Unmarshal(): ", err)
    }

    // Let's print the unmarshalled data!
    log.Printf("origin: %s\n", payload["origin"])
    log.Printf("user: %s\n", payload["user"])
    log.Printf("status: %t\n", payload["active"])
}

现在注意到,由于有了interface{} 地图,我们可以很容易地存储任意的数据!

总结

希望你现在已经对如何使用Go读取JSON数据有了很好的理解。