この質問は、stackoverflowの他のオブジェクトと非常によく似ていますが、私の使用例に他の質問をモデル化できませんでした。入れ子にされたマップの多くのレイヤーを持つ非マーシャルJSON
私はを反復処理し、ホストの状態を確認することができますので、配列にgroups
下のハッシュを取得しようとしていますこのようになりますJSON(この記事のために簡略化)
{
"somekey": "string",
"state": {
"groups": {
"host:host1": {
"status": "OK",
"morethings": "blah"
},
"host:host2": {
"status": "Alert",
"morethings": "blah"
}
}
}
}
を持っています。ここでの他の記事のいくつかに基づいて
私はこのexampleで正しい軌道に乗っていたと感じた:
package main
import (
"encoding/json"
"fmt"
)
const jsonStream = `
{
"state": {
"groups": {
"host:i-b3a6cea5": {
"status": "OK",
"last_triggered_ts": null,
"last_nodata_ts": null,
"name": "host:i-b3a6cea5",
"last_notified_ts": null,
"last_resolved_ts": null
},
"host:i-4d81ca7c": {
"status": "OK",
"last_triggered_ts": null,
"last_nodata_ts": null,
"name": "host:i-4d81ca7c",
"last_notified_ts": null,
"last_resolved_ts": null
},
"host:i-a03a7758": {
"status": "Alert",
"triggering_value": {
"to_ts": 1475092440,
"value": 2,
"from_ts": 1475092380
},
"last_triggered_ts": 1475092440,
"last_nodata_ts": null,
"name": "host:i-a03a7758",
"last_notified_ts": 1475092440,
"last_resolved_ts": null
}
}
}
}`
type hostDetails struct {
Status string `json:"status"`
Name string `json:"name"`
}
type GroupsData struct {
Groups map[string]hostDetails `json:"groups"`
}
type Data struct {
State map[string]GroupsData `json:"state"`
}
func main() {
var data Data
err := json.Unmarshal([]byte(jsonStream), &data)
if err != nil {
fmt.Println(err)
}
fmt.Println(data)
}
が、私は唯一の空のデータ構造で終わる:
{map[groups:{map[]}]}
かどうかを確認するには正しいトラック上にあってもJSONを修正してstate
キーを取り出して、groups
がトップレベルになったようにしました。私はhere
見られるように、それはデータ構造を移入することを行うと
私は、私は2番目のレベルをネストではなく、1つのレベルを扱うことができる理由を理解するのに苦労していますか?
私の洞窟人の脳は、私が持っているネスティングのレベルの数だけパターンを再利用できるはずだと思っています。
この時点で、私はほとんどの日々を過ごしていて、私の目の前にあるものを見逃しているように感じますが、見えません。
追加のネスティングレイヤーを処理する方法については、どのような指針もありがたいです。