首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何解析/反序列化动态JSON

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

Stack Overflow用户
提问于 2015-03-30 13:09:12
回答 4查看 38.3K关注 0票数 47

场景:

考虑以下是JSON:

代码语言:javascript
代码运行次数:0
运行
复制
{
   "Bangalore_City": "35_Temperature",
   "NewYork_City": "31_Temperature",
   "Copenhagen_City": "29_Temperature"
}

如果您注意到,数据是以这样的方式构造的,即没有硬编码的键提到City/Temperature,它基本上只是值。

问题:我无法解析任何动态的JSON。

问题:能为这种JSON解析找到解决方案吗?我尝试了简简单单加布 & default encoding/json,但是没有成功。

注释:上面的JSON只是用于示例。还有很多应用程序正在使用当前的API,所以我不想改变数据的结构。我的意思是我不能改变如下的东西:

代码语言:javascript
代码运行次数:0
运行
复制
[{
   "City_Name":"Bangalore",
   "Temperature": "35"
},...]

然后我可以定义struct

代码语言:javascript
代码运行次数:0
运行
复制
type TempData struct {
  City_Name string
  Temperature  string
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-30 13:11:52

例如,您可以将其解封为一个map[string]string

代码语言:javascript
代码运行次数:0
运行
复制
m := map[string]string{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)

输出(包装):

代码语言:javascript
代码运行次数:0
运行
复制
map[Bangalore_City:35_Temperature NewYork_City:31_Temperature
    Copenhagen_City:29_Temperature]

围棋游乐场上试一试。

这样,无论键或值是什么,您都可以在map中打印或遍历所有对。

还请注意,虽然您的示例只包含string值,但是如果值类型是变化的(例如string、数字等),您可以对值类型使用interface{},在这种情况下,您的映射将是map[string]interface{}类型。

还请注意,我创建了一个库来轻松地处理这样的动态对象,在这些情况下,这可能是一个很大的帮助:github.com/icza/dyno

票数 63
EN

Stack Overflow用户

发布于 2018-05-30 18:28:07

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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)
        })
    }
})
票数 10
EN

Stack Overflow用户

发布于 2020-11-30 09:51:49

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

代码语言:javascript
代码运行次数:0
运行
复制
var m interface{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29347092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档