读取外部JSON文件

时间:2019-07-11 14:45:21

标签: json go

我正在尝试读取以下JSON文件:

{
    "a":1,
    "b":2,
    "c":3
}

我已经尝试过了,但是我发现必须将JSON文件的每个字段都写到struct中,但是我真的不想在Go代码中包含所有的JSON文件。

import (
    "fmt"
    "encoding/json"
    "io/ioutil"
)

type Data struct {
    A string `json:"a"`
    B string `json:"b"`
    C string `json:"c"`
}

func main() {
    file, _ := ioutil.ReadFile("/path/to/file.json")
    data := Data{}

    if err := json.Unmarshal(file ,&data); err != nil {
        panic(err)
    }
    for _, letter := range data.Letter {
        fmt.Println(letter)
    }
}

是否可以用Python中的json.load(file)之类的东西来绕过这个东西?

3 个答案:

答案 0 :(得分:3)

如果只想支持整数值,则可以将数据解组为map[string]int。请注意,未定义地图的顺序,因此以下程序的输出对于输入是不确定的。

package main

import (
    "fmt"
    "encoding/json"
    "io/ioutil"
)

func main() {
    file, _ := ioutil.ReadFile("/path/to/file.json")
    var data map[string]int

    if err := json.Unmarshal(file ,&data); err != nil {
        panic(err)
    }
    for letter := range data {
        fmt.Println(letter)
    }
}

答案 1 :(得分:2)

您可以通过以下方式取消封送任何JSON数据:

var data interface{}
if err := json.Unmarshal(..., &data); err != nil {
    // handle error
}

但是,通过这种方式,您应该处理所有与反射有关的东西 因为您不知道根data的类型及其字段。 更糟糕的是,您的data可能根本不是map。 它可以是任何有效的JSON数据类型,例如数组,字符串,整数等。

这是一个游乐场链接:https://play.golang.org/p/DiceOv4sATO

答案 2 :(得分:1)

不可能做像Python一样简单的事情,因为Go是严格类型的,因此有必要将目标传递给unmarshal函数。

否则,您编写的内容可能会略有缩短:

func UnmarshalJSONFile(path string, i interface{}) error {
    f, err := os.Open(path)
    if err != nil {
        return err
    }
    defer f.Close()
    return json.NewDecoder(f).Decode(i)
}

但是要使用它,您可以这样做:

func main() {
    data := Data{}
    if err := UnmarshalJSONFile("/path/to/file.json", &data); err != nil {
        panic(err)
    }
}

但是您可以看到UnmarshalJSONFile非常简单,几乎不需要标准的库函数。