我们如何在golang中将json文件作为json对象读取

时间:2016-12-14 05:48:16

标签: json go file-read

我有一个存储在本地计算机上的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对象读取?有可能吗? 任何帮助表示赞赏。提前谢谢!

1 个答案:

答案 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总是一种更好的方法。