Golang解析复杂的json



我是golang和json的新手,目前很难从系统中解析出json。

我读了几篇关于go中动态json的博客文章,也尝试了json2GoStructs等工具用这个工具解析我的json文件只是给了我一个巨大的结构体,我发现有点乱。我也不知道如何得到我感兴趣的信息。

那么,这里是我的问题:

  1. 我如何获得我感兴趣的信息?
  2. 解析复杂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"))

最新更新