场景:
考虑以下是JSON:
{
"Bangalore_City": "35_Temperature",
"NewYork_City": "31_Temperature",
"Copenhagen_City": "29_Temperature"
}
如果您注意到,数据是以这样的方式构造的,即没有硬编码的键提到City
/Temperature
,它基本上只是值。
问题:我无法解析任何动态的JSON。
问题:能为这种JSON解析找到解决方案吗?我尝试了简简单单,加布 & default encoding/json
,但是没有成功。
注释:上面的JSON只是用于示例。还有很多应用程序正在使用当前的API,所以我不想改变数据的结构。我的意思是我不能改变如下的东西:
[{
"City_Name":"Bangalore",
"Temperature": "35"
},...]
然后我可以定义struct
type TempData struct {
City_Name string
Temperature string
}
发布于 2015-03-30 05:11:52
例如,您可以将其解封为一个map[string]string
:
m := map[string]string{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
panic(err)
}
fmt.Println(m)
输出(包装):
map[Bangalore_City:35_Temperature NewYork_City:31_Temperature
Copenhagen_City:29_Temperature]
在围棋游乐场上试一试。
这样,无论键或值是什么,您都可以在map
中打印或遍历所有对。
还请注意,虽然您的示例只包含string
值,但是如果值类型是变化的(例如string
、数字等),您可以对值类型使用interface{}
,在这种情况下,您的映射将是map[string]interface{}
类型。
还请注意,我创建了一个库来轻松地处理这样的动态对象,在这些情况下,这可能是一个很大的帮助:github.com/icza/dyno
。
发布于 2018-05-30 10:28:07
标准encoding/json
适用于大多数用例,但与其他解决方案相比,它可能比较慢。如果需要性能,请尝试使用快讯。它解析任意JSON,而不需要创建与JSON模式匹配的结构或映射。
参见下面的示例代码。它遍历JSON对象的所有(key, value)
对:
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)
})
}
})
发布于 2020-11-30 01:51:49
仅仅是为如何解析任何有效的JSON添加一个一般的答案;var m interface{}
适用于所有类型。这包括map ( OP要求的)数组、字符串、数字和嵌套结构。
var m interface{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
panic(err)
}
fmt.Println(m)
https://stackoverflow.com/questions/29347092
复制