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,User 和Active ,而不是origin,user 和active 。
从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数据有了很好的理解。