登录
首页 >  Golang >  Go问答

如何使用 Go unmarshal 解析复杂的 JSON?

来源:Golang技术栈

时间:2023-04-01 11:11:49 392浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《如何使用 Go unmarshal 解析复杂的 JSON?》,主要介绍了golang,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

go标准包encoding/json中公开json.Unmarshal了解析 JSON 的函数。

可以在预定义的 中解组 JSON 字符串struct,或者使用interface{}并迭代结果以获取意外的 JSON 数据结构。

也就是说,我无法正确解析复杂的 JSON。有人可以告诉我如何实现这一目标吗?

 {
     "k1" : "v1", 
     "k2" : "v2", 
     "k3" : 10, 
     "result" : [
                 [
                 ["v4", v5, {"k11" : "v11", "k22" : "v22"}]
                 , ... , 
                 ["v4", v5, {"k33" : "v33", "k44" : "v44"}
                 ]
                 ], 
                 "v3"
                ] 
}

正确答案

引用JSON 和 Go

在不知道该数据结构的情况下,我们可以使用 Unmarshal 将其解码为 interface{} 值:

b := []byte(`{
   "k1" : "v1", 
   "k3" : 10,
   result:["v4",12.3,{"k11" : "v11", "k22" : "v22"}]
}`)
var f interface{}
err := json.Unmarshal(b, &f)

此时 f 中的 Go 值将是一个映射,其键是字符串,其值本身存储为空接口值:

f = map[string]interface{}{
    "k1": "v1",
    "k3":  10,
    "result": []interface{}{
       "v4",
       12.3,
       map[string]interface{}{
           "k11":"v11",
           "k22":"v22",
       },
    },
}

要访问这些数据,我们可以使用类型断言来访问f的底层 map[string]interface{}:

m := f.(map[string]interface{})

然后我们可以使用 range 语句遍历 map 并使用类型开关来访问其值作为它们的具体类型:

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")
    }
}

通过这种方式,您可以处理未知的 JSON 数据,同时仍然享受类型安全的好处。

有关 Go 和 JSON 的更多信息可以在原始文章中找到。我稍微更改了代码片段,使其更类似于问题中的 JSON。

到这里,我们也就讲完了《如何使用 Go unmarshal 解析复杂的 JSON?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>