目录

之前分享了一遍文关于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]