2016-09-29 8 views
1

この質問は、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つのレベルを扱うことができる理由を理解するのに苦労していますか?
私の洞窟人の脳は、私が持っているネスティングのレベルの数だけパターンを再利用できるはずだと思っています。
この時点で、私はほとんどの日々を過ごしていて、私の目の前にあるものを見逃しているように感じますが、見えません。
追加のネスティングレイヤーを処理する方法については、どのような指針もありがたいです。

答えて

0

1 - あなたが使用して1つの余分レベルを削除することがあります。

var data map[string]GroupsData 

The Go Playground上でそれを試してみてください。

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    var data map[string]GroupsData 
    err := json.Unmarshal([]byte(jsonStream), &data) 
    if err != nil { 
     fmt.Println(err) 
    }  
    fmt.Println(data)  
} 

type GroupsData struct { 
    Groups map[string]HostDetails `json:"groups"` 
} 

type HostDetails struct { 
    Status string `json:"status"` 
    Name string `json:"name"` 
} 

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 
      } 
     } 
    } 
}` 

出力:

map[state:{map[host:i-b3a6cea5:{OK host:i-b3a6cea5} host:i-4d81ca7c:{OK host:i-4d81ca7c} host:i-a03a7758:{Alert host:i-a03a7758}]}] 

2 - あなたがかもしれません使用:

type Data struct { 
    State GroupsData `json:"state"` 
} 

The Go Playground上でそれを試してみてください。

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    var data Data  
    err := json.Unmarshal([]byte(jsonStream), &data) 
    if err != nil { 
     fmt.Println(err) 
    }  
    fmt.Println(data)  
} 

type Data struct { 
    State GroupsData `json:"state"` 
} 
type GroupsData struct { 
    Groups map[string]hostDetails `json:"groups"` 
} 

type hostDetails struct { 
    Status string `json:"status"` 
    Name string `json:"name"` 
} 

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 
     } 
    } 
    } 
}` 

出力:

{{map[host:i-b3a6cea5:{OK host:i-b3a6cea5} host:i-4d81ca7c:{OK host:i-4d81ca7c} host:i-a03a7758:{Alert host:i-a03a7758}]}} 

JSONデータ内の1つの特別なレベル"state": {}とあなたのcode作品:The Go Playground

0

あなたの間違いはData.Stateが地図であってはならないということです。定義を

type Data struct { 
    State GroupsData `json:"state"` 
} 

に変更すると、それはhttps://play.golang.org/p/oRjSJMDzU8になります。

関連する問題