我有一个存储在本地计算机上的JSON文件。我需要在变量中读取它并循环遍历它以获取JSON对象值。如果我在使用ioutil.Readfile方法读取文件后使用Marshal命令,它会将一些数字作为输出。这是我的几次失败尝试,
尝试1:
plan, _ := ioutil.ReadFile(filename) // filename is the JSON file to read
var data interface{}
err := json.Unmarshal(plan, data)
if err != nil {
log.Error("Cannot unmarshal the json ", err)
}
fmt.Println(data)
它给了我以下错误,
time="2016-12-13T22:13:05-08:00" level=error msg="Cannot unmarshal the json json: Unmarshal(nil)"
<nil>
尝试2:我尝试将JSON值存储在结构中,然后使用MarshalIndent
generatePlan, _ := json.MarshalIndent(plan, "", " ") // plan is a pointer to a struct
fmt.Println(string(generatePlan))
它给我输出字符串。但是,如果我将输出转换为字符串,那么我将无法将其作为JSON对象循环。
如何在golang中将JSON文件作为JSON对象读取?有可能吗? 任何帮助表示赞赏。提前谢谢!
答案 0 :(得分:24)
json.Unmarshal
填充的值必须是指针。
来自GoDoc:
Unmarshal解析JSON编码的数据,并将结果以指向的值存储到v。
所以你需要做以下事情:
plan, _ := ioutil.ReadFile(filename)
var data interface{}
err := json.Unmarshal(plan, &data)
您的错误(Unmarshal(nil))表示在阅读文件时出现问题,请检查ioutil.ReadFile
另请注意,在unmarshal中使用空接口时,您需要使用type assertion将基础值作为原始类型。
要将JSON解组为接口值,Unmarshal存储其中一个 这些在界面值中:
bool, for JSON booleans float64, for JSON numbers string, for JSON strings []interface{}, for JSON arrays map[string]interface{}, for JSON objects nil for JSON null
使用Unmarshal
使用具体结构来填充json总是一种更好的方法。