我是golang和json的新手,目前很难从系统中解析出json。
我读了几篇关于go中动态json的博客文章,也尝试了json2GoStructs等工具用这个工具解析我的json文件只是给了我一个巨大的结构体,我发现有点乱。我也不知道如何得到我感兴趣的信息。
那么,这里是我的问题:
- 我如何获得我感兴趣的信息? 解析复杂json的最佳方法是什么?
我只对感兴趣进入以下3个json字段:
Name
Guid
Task -> Property -> Name: Error
我感谢每一个提示,代码片段或解释!
这是我到目前为止得到的(主要来自教程):
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
func checkErr(err error) {
if err != nil {
panic(err)
}
}
func readFile(filePath string) []byte {
data, err := ioutil.ReadFile(filePath)
checkErr(err)
return data
}
func main() {
path := "/Users/andi/Documents/tmp/wfsJob.json"
data := readFile(path)
var f interface{}
err := json.Unmarshal(data, &f)
checkErr(err)
m := f.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv)
case int:
fmt.Println(k, "is int", vv)
case []interface{}:
fmt.Println(k, "is an array:")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
}
我可以为您提供在Golang中使用JSON的简单方法。有了这个工具,你不需要解析整个json文件,你可以不用struct来使用它。
Gjson是从JSON字符串中获取一些字段的一个很好的解决方案。但是,当必须从JSON的不同部分提取许多(超过2个)字段时,它可能会变得很慢,因为它会在每个Get
调用上重新解析JSON。此外,它需要调用gjson。对于验证传入的JSON是有效的,因为其他方法假设调用者提供了有效的JSON。
有一个替代包- fastjson。像gsjon
一样,它速度快,API也很好。不像gjson
,它验证输入JSON和工作速度更快,当许多不相关的字段必须从JSON中获得。下面是从原始问题中获取字段的示例代码:
var p fastjson.Parser
v, err := p.ParseBytes(data)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Name: %s", v.GetStringBytes("Name"))
fmt.Printf("Guid: %s", v.GetStringBytes("Guid"))
fmt.Printf("Error: %s", v.GetStringBytes("Task", "Property", "Name"))