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 關注
- 115 瀏覽
添加回答
舉報