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

如何解析/反序列化动态 JSON

如何解析/反序列化动态 JSON

Go
守着一只汪 2021-09-27 15:35:14
场景:考虑以下是 JSON :{   "Bangalore_City": "35_Temperature",   "NewYork_City": "31_Temperature",   "Copenhagen_City": "29_Temperature"}如果您注意到,数据的结构方式没有硬编码键提及City/Temperature它基本上只是值。问题:我无法解析任何动态的 JSON。问题:有人能找到这种 JSON 解析的解决方案吗?我试过go-simplejson,gabs & defaultencoding/json但没有运气。注意: 以上 JSON 仅用于示例。并且有很多应用程序都在使用当前的 API,所以我不想改变数据的结构。我的意思是我不能更改为以下内容:[{   "City_Name":"Bangalore",   "Temperature": "35"},...]然后我可以定义 structtype TempData struct {  City_Name string  Temperature  string}
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

标准encoding/json适用于大多数用例,但与替代解决方案相比,它可能相当慢。如果您需要性能,请尝试使用fastjson。它可以解析任意 JSON,而无需创建与 JSON 模式匹配的结构或映射。


请参阅下面的示例代码。它遍历(key, value)JSON 对象的所有对:


var p fastjson.Parser

v, err := p.Parse(input)

if err != nil {

    log.Fatal(err)

}


// Visit all the items in the top object

v.GetObject().Visit(func(k []byte, v *fastjson.Value) {

    fmt.Printf("key=%s, value=%s\n", k, v)


    // for nested objects call Visit again

    if string(k) == "nested" {

        v.GetObject().Visit(func(k []byte, v *fastjson.Value) {

            fmt.Printf("nested key=%s, value=%s\n", k, v)

        })

    }

})


查看完整回答
反对 回复 2021-09-27
?
梵蒂冈之花

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

只是添加一个关于如何解析任何有效 JSON 的一般答案;var m interface{}适用于所有类型。这包括映射(OP 要求的)数组、字符串、数字和嵌套结构。


var m interface{}

err := json.Unmarshal([]byte(input), &m)

if err != nil {

    panic(err)

}

fmt.Println(m)


查看完整回答
反对 回复 2021-09-27
  • 3 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

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