2 回答
TA贡献2051条经验 获得超10个赞
一种选择可能是延迟解析,直到您知道类型为止。类似下面的内容(游乐场):
devices := make(map[string]json.RawMessage)
err := json.Unmarshal(b, &devices)
if err != nil {
log.Fatal(err)
}
for key, jsonVal:= range devices {
if len(key) > 5 && key[:5] == "Card:" {
var dev Device
err := json.Unmarshal(jsonVal, &dev)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", dev)
} else if len(key) > 6 && key[:6] == "Color:" {
var oth Other
err := json.Unmarshal(jsonVal, &oth)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", oth)
}
}
注意:不清楚您要如何处理数据,因此我现在只是打印结构。它也不太清楚如何识别每个元素的类型(问题中的示例与示例代码中的示例不同);可能有一些API的文档可以解释这一点?。
TA贡献1776条经验 获得超12个赞
我会这样做:
package main
import (
"encoding/json"
"fmt"
)
const s = `
{
"Card:5417871461137421886": {
"applicationUUID": "5417871461137421886",
"commit": "test_commit",
"externalUUID": "test_externalUUID",
"lastSeen": "test_lastSeen",
"localUUID": "E4:F5:13:8E:F5:43",
"progress": "3.5",
"state": "test_state"
},
"Card:5417871461137421886.Color": {
"applicationUUID": "5417871461137421886",
"color": "blue"
}
}
`
func main() {
var m map[string]struct {
ApplicationUUID, Color, Commit, ExternalUUID, LastSeen, LocalUUID string
Progress, State string
}
json.Unmarshal([]byte(s), &m)
fmt.Printf("%+v\n", m)
}
但似乎也会起作用。map[string]map[string]string
- 2 回答
- 0 关注
- 89 浏览
添加回答
举报