Golang 中的 Json 解析

我正在尝试从第三方软件解析 json。它返回一个像这样的json


   "top1/dir1": "10",

   "top1/dir2": "20",

   "top1/dir3": "30",

   "top2/diff_val1": "40"

}

JSONLint 说这是一个有效的 json。但我不知道如何用 golang 解析它。


我用来解析上面的 json 文件的代码(很明显,我从另一个 stackoverflow 帖子中获取了代码)。


package main


import (

        "encoding/json"

        "fmt"

        "io/ioutil"

        "log"

)


type mytype []map[string]string


func main() {

        var data mytype

        file, err := ioutil.ReadFile("t1.json")

        if err != nil {

                log.Fatal(err)

        }

        err = json.Unmarshal(file, &data)

        if err != nil {

                log.Fatal(err)

        }

        fmt.Println(data)

}

当我执行 go run main.go 时,出现以下错误


$ go run main.go 2016/06/19 22:53:57 json: 无法将对象解组为 main.mytype 退出状态 1 的 Go 值


我确实尝试使用另一个库 - “github.com/Jeffail/gabs”来解析这种格式,但没有成功。由于这是一个有效的 json,我很确定它可以被解析,但我不确定如何解析。


慕盖茨4494581
浏览 174回答 3
3回答

尚方宝剑之说

有一个 Go 包,其中包含用于解码 JSON 字符串的方法。https://golang.org/pkg/encoding/json/#Unmarshal这是一个使用示例:package mainimport (    "encoding/json"    "fmt")func main() {    var jsonBlob = []byte(`[        {"Name": "Platypus", "Order": "Monotremata"},        {"Name": "Quoll",    "Order": "Dasyuromorphia"}    ]`)    type Animal struct {        Name  string        Order string    }    var animals []Animal    err := json.Unmarshal(jsonBlob, &animals)    if err != nil {        fmt.Println("error:", err)    }    fmt.Printf("%+v", animals)}编辑:正如 Malik 所指出的,您传递的指针的值的类型是错误的。在这种情况下,您的类型应该是map[string]interface{}(最好,因为 JSON 字段可能不存储字符串)或map[string]string代替[]map[string]string. 开头的括号是错误的:这将是一个 JSON 对象数组。

汪汪一只猫

只是你的程序中有一个小错字。您已声明mytype为一片地图,而不仅仅是一张地图。只是改变:type mytype []map[string]string到:type mytype map[string]string有关示例,请参见https://play.golang.org/p/pZQl8jV5TC 。

慕斯709654

乔纳森的回答提供了一个解码 JSON 的好例子,并链接了相关的包。您没有提供太多关于您的解析到底出了什么问题的详细信息,但是如果我不得不猜测一下,我会说您可能没有创建一个适当的结构来包含解组后的 JSON。因为 Go 是静态类型的,它希望数据遵循明确定义的格式。如果你不想费心去定义结构,你可以只使用一个空的接口对象,这在 Go 中是一个包罗万象的东西。只需声明一个类型为 []interface{} 的变量,然后将其传递给 JSON 解组函数。希望这可以帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go