为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的 Json 解析

Golang 中的 Json 解析

Go
慕盖茨4494581 2022-01-17 19:51:28
我正在尝试从第三方软件解析 json。它返回一个像这样的json{    "top1/dir1": "10",   "top1/dir2": "20",   "top1/dir3": "30",   "top2/diff_val1": "40"}JSONLint 说这是一个有效的 json。但我不知道如何用 golang 解析它。我用来解析上面的 json 文件的代码(很明显,我从另一个 stackoverflow 帖子中获取了代码)。package mainimport (        "encoding/json"        "fmt"        "io/ioutil"        "log")type mytype []map[string]stringfunc 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,我很确定它可以被解析,但我不确定如何解析。
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

有一个 Go 包,其中包含用于解码 JSON 字符串的方法。


https://golang.org/pkg/encoding/json/#Unmarshal


这是一个使用示例:


package main


import (

    "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 对象数组。


查看完整回答
反对 回复 2022-01-17
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

只是你的程序中有一个小错字。您已声明mytype为一片地图,而不仅仅是一张地图。

只是改变:

type mytype []map[string]string

到:

type mytype map[string]string

有关示例,请参见https://play.golang.org/p/pZQl8jV5TC 。


查看完整回答
反对 回复 2022-01-17
?
慕斯709654

TA贡献1840条经验 获得超5个赞

乔纳森的回答提供了一个解码 JSON 的好例子,并链接了相关的包。您没有提供太多关于您的解析到底出了什么问题的详细信息,但是如果我不得不猜测一下,我会说您可能没有创建一个适当的结构来包含解组后的 JSON。因为 Go 是静态类型的,它希望数据遵循明确定义的格式。

如果你不想费心去定义结构,你可以只使用一个空的接口对象,这在 Go 中是一个包罗万象的东西。只需声明一个类型为 []interface{} 的变量,然后将其传递给 JSON 解组函数。希望这可以帮助!


查看完整回答
反对 回复 2022-01-17
  • 3 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信