2016-12-14 165 views
0

我有一个JSON文件存储在本地机器上。我需要在一个变量中读取它并循环通过它来获取JSON对象值。如果在使用ioutil.Readfile方法读取文件后使用Marshal命令,则会将一些数字作为输出。这些都是我的一些失败的尝试,我们如何读取json文件作为golang中的json对象

尝试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对象进行循环。

我们如何读取一个JSON文件作为golang中的JSON对象?有可能这样做吗? 任何帮助表示赞赏。提前致谢!

回答

6

需要填写的值为json.Unmarshal需要指针。

GoDoc

解组解析JSON编码的数据,并将结果存储在价值用V指出

所以,你需要做到以下几点:

plan, _ := ioutil.ReadFile(filename) 
var data interface{} 
err := json.Unmarshal(plan, &data) 

您的错误(Unmarshal(nil))表示在阅读中存在一些问题Ë文件,请检查返回的错误由ioutil.ReadFile


同时请注意,使用解组一个空的接口时,你就需要使用type assertion得到基本价值观去原始类型。

散集JSON成一个接口值,解组存储在接口值的 其中之一:

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 

它始终是一个更好的方法来使用混凝土结构来填充你的JSON使用Unmarshal