我正在尝试读取以下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)
之类的东西来绕过这个东西?
答案 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
非常简单,几乎不需要标准的库函数。