golang通过map嵌套读取json
目录
之前分享了一遍文关于golang读取json配置文件
其中我们采用struct预先定义了json的结构体,但有些朋友问能不能不限预定义结构体呢,一来太浪费时间,二来如果接口请求或返回数据有调整,结构体也需要随时调整,能不能像弱语言的数组,能容下各种数据结构呢?
golang中我们可以通过map键值对来处理这个问题,既可以免去预定义,还支持不同valueType的数据结构。
json配置文件
还是以pdd.json这个json配置文件为例:
pdd.json
{
"pids":{
"default":{
"pid":"1844_71935560",
"desc":"app1"
},
"shehui":{
"pid":"1844_101751664",
"desc":"app2"
}
},
"top_words":[
"邓紫棋",
"沈腾",
"关晓彤",
"鹿晗"
]
}
不再预定义结构体
无
json转换成map
package main
import (
"encoding/json"
"fmt"
"os"
)
func parseJsonConfig(filepath string) (conf map[string]interface{}) {
// 打开文件
file, _ := os.Open(filepath)
// 关闭文件
defer file.Close()
conf = make(map[string]interface{})
//NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。
//Decode从输入流读取下一个json编码值并保存在v指向的值里
err := json.NewDecoder(file).Decode(&conf)
if err != nil {
fmt.Println("Error:", err)
}
return
}
func main() {
pdd := parseJsonConfig("pdd.json")
fmt.Println(pdd)
pids := pdd["pids"].(map[string]interface{})
fmt.Println(pids["shehui"])
}
注意:由于这个json结构是嵌套的,所以转换成map后也是嵌套,而在读取嵌套map的时候,不能采用pdd["pids"]["shehui"]
的方式,会报type interface {} does not support indexing,需要先如下处理:
pids := pdd["pids"].(map[string]interface{})
fmt.Println(pids["shehui"])
输出
$ go run .\test.go
map[pids:map[default:map[desc:app1 pid:1844_71935560] shehui:map[desc:app2 pid:1844_101751664]] top_words:[邓紫棋 沈腾 关晓彤 鹿晗]]
map[desc:app2 pid:1844_101751664]