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

问题描述 投票:0回答:3

我在本地计算机上存储了一个 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对象?可以这样做吗? 任何帮助表示赞赏。预先感谢!

json go file-read
3个回答
66
投票

要由

json.Unmarshal
填充的值需要是一个指针。

来自GoDoc

Unmarshal 解析 JSON 编码的数据并将结果存储在 v 指向的值中。

因此您需要执行以下操作:

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

您的错误(Unmarshal(nil))表示读取文件时出现问题,请检查

ioutil.ReadFile

返回的错误

另请注意,在 unmarshal 中使用空接口时,您需要使用 类型断言 来获取底层值作为 go 原始类型。

要将 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

使用具体结构来填充 json 始终是一个更好的方法

Unmarshal


11
投票

如果您在 2022 年查看此内容,则

ioutil
软件包已被弃用。您仍然可以使用它,但您会遇到恼人的错误。

您可以使用 os 包。

someStruct := SomeStruct{}  // Read errors caught by unmarshal
fileBytes, _ := os.ReadFile(filename)   
err := json.Unmarshal(fileBytes, spec) 

注意,为了示例起见,我特意忽略了

os.ReadFile
中的错误,因为它也会导致
json.Unmarshal
中出现错误。


0
投票

随着泛型的引入,这已成为一个非常有用的片段。

func LoadJSON[T any](filename string) (T, error) {
    var data T
    fileData, err := os.ReadFile(filename)
    if err != nil {
        return data, err
    }
    return data, json.Unmarshal(fileData, &data)
}
© www.soinside.com 2019 - 2024. All rights reserved.