读取文件
首先要能读取文件内容,读取文件内容可以使用os.Open()
打开一个文件,然后再使用ioutil.ReadAll()
读取文件的内容。这里要注意一下,ioutil.ReadAll()
读取到的是字节,也就是[]bytes
数据类型。如果你需要把字节转换成字符可以在使用string()
函数转成字符。如这个例子,读取user.json
文件并打印出内容
user.json
{
"first_name": "Nicholas",
"last_name": "Lee",
"blog_url": "https://www.qttc.net",
"blog_name": "琼台博客"
}
main.go
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
// 打开json文件
jsonFile, err := os.Open("user.json")
// 最好要处理以下错误
if err != nil {
fmt.Println(err)
}
// 要记得关闭
defer jsonFile.Close()
byteValue, _ := ioutil.ReadAll(jsonFile)
fmt.Println(string(byteValue))
}
运行结果
$ go run main.go
{
"first_name": "Nicholas",
"last_name": "Lee",
"blog_url": "https://www.qttc.net",
"blog_name": "琼台博客"
}
解析json内容
以上我们成功读取到了JSON文件的内容,现在我们就要解析它,我通常比较喜欢使用struct类型做转换,所以我们先定义一个struct
type User struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
BlogURL string `json:"blog_url"`
BlogName string `json:"blog_name"`
}
然后我们在使用json.Unmarshal()
方法把json内容转为struct,如这个例子
main.go
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type User struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
BlogURL string `json:"blog_url"`
BlogName string `json:"blog_name"`
}
func main() {
// 打开json文件
jsonFile, err := os.Open("user.json")
// 最好要处理以下错误
if err != nil {
fmt.Println(err)
}
// 要记得关闭
defer jsonFile.Close()
byteValue, _ := ioutil.ReadAll(jsonFile)
var user User
json.Unmarshal([]byte(byteValue), &user)
fmt.Println(user)
}
运行结果
$ go run main.go
{Nicholas Lee https://www.qttc.net 琼台博客}
当然,如果你很懒不想定义struct,也可以直接使用map[string]interface{}
,如
main.go
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
func main() {
// 打开json文件
jsonFile, err := os.Open("user.json")
// 最好要处理以下错误
if err != nil {
fmt.Println(err)
}
// 要记得关闭
defer jsonFile.Close()
byteValue, _ := ioutil.ReadAll(jsonFile)
var result map[string]interface{}
json.Unmarshal([]byte(byteValue), &result)
fmt.Println(result)
}
运行结果
$ go run main.go
map[blog_name:琼台博客 blog_url:https://www.qttc.net first_name:Nicholas last_name:Lee]
不太推荐使用map[string]interface{}
的方式,这样在开发的时候总是很不舒服,不知道map
里都有哪些属性。