2016-04-14 15 views
0

私は新しいです、私は以下のようにjson構造から特定のキーを抽出しようとしています。ネストされた動的キーからデータを取得するgolangのjson

{ 
    "cluster_name": "escluster", 
    "nodes": { 
     "Sd2AvEXsswjTn6ErRYjg": { 
      "timestamp": 1460624696217, 
      "name": "master1", 
      "transport_address": "10.0.0.1:9300", 
      "host": "10.0.0.1:9300", 
      "ip": [ 
       "10.0.0.1:9300", 
       "NONE" 
      ], 
      "attributes": { 
       "data": "false", 
       "master": "true" 
      }, 
      "os": { 
       "timestamp": 1460624696217, 
       "cpu_percent": 0, 
       "load_average": 0, 
       "mem": { 
        "total_in_bytes": 163987664, 
        "free_in_bytes": 136357264, 
        "used_in_bytes": 26629400, 
        "free_percent": 84, 
        "used_percent": 16 
       }, 
       "swap": { 
        "total_in_bytes": 0, 
        "free_in_bytes": 0, 
        "used_in_bytes": 0 
       } 
      } 
     }, 
     "yzabB-OaTfOqvgAELIMq1Q": { 
      "timestamp": 1460624938213, 
      "name": "data_1", 
      "transport_address": "10.0.0.2:9300", 
      "host": "10.0.0.2", 
      "ip": [ 
       "10.0.0.2:9300", 
       "NONE" 
      ], 
      "attributes": { 
       "master": "false" 
      }, 
      "os": { 
       "timestamp": 1460624938213, 
       "cpu_percent": 0, 
       "load_average": 0.29, 
       "mem": { 
        "total_in_bytes": 623840000, 
        "free_in_bytes": 4127648, 
        "used_in_bytes": 666, 
        "free_percent": 1, 
        "used_percent": 99 
       }, 
       "swap": { 
        "total_in_bytes": 0, 
        "free_in_bytes": 0, 
        "used_in_bytes": 0 
       } 
      } 
     }, 
     "q5CdgUF2TRewujr-0RPMgQ": { 
      "timestamp": 1460624934417, 
      "name": "master_0", 
      "transport_address": "10.0.0.3:9300", 
      "host": "10.0.0.2", 
      "ip": [ 
       "10.0.0.3:9300", 
       "NONE" 
      ], 
      "attributes": { 
       "data": "false", 
       "master": "true" 
      }, 
      "os": { 
       "timestamp": 1460624934417, 
       "cpu_percent": 0, 
       "load_average": 0, 
       "mem": { 
        "total_in_bytes": 163898764, 
        "free_in_bytes": 139705616, 
        "used_in_bytes": 24194588, 
        "free_percent": 85, 
        "used_percent": 15 
       }, 
       "swap": { 
        "total_in_bytes": 0, 
        "free_in_bytes": 0, 
        "used_in_bytes": 0 
       } 
      } 
     } 
    } 
}  

ノード名が動的であるため、私は、各ノードのためにMEMを取得したいと思います。私はthisが動的キーではなくデータを取得することがわかりました。どうやってこれをやり遂げることができますか?移動中のデータを処理する方法を学ぶため

答えて

1

良い参考:http://blog.golang.org/json-and-go

あなたの問題について、あなたのデータは比較的よく構造化されているようにそれは私には思われる...私は、各ノードのmem一部を抽出する例を設定しています次の遊び場の例で:

http://play.golang.org/p/0O5U-3N_tA

その要旨は、が何であれ強くstruct Sとして符号化することができる指定されたことです。動的なもの(ノード名など)はマップとしてエンコードできます。

type Node struct { 
    Timestamp  uint64   `json:timestamp` 
    Name    string   `json:name` 
    TransportAddress string   `json:transport_address` 
    Host    string   `json:host` 
    Ip    []string   `json:ip` 
    Attributes  map[string]string `json:attributes` 
    Os    *OsInfo   `json:os` 
} 

type Payload struct { 
    Name string   `json:cluster_name` 
    Nodes map[string]*Node `json:nodes` 
} 

は(そのstruct定義を経由して)ノードの一般的な構造自体は保存されているノード事実を経由して、それらを動的にインデックスを作成しているという事実(の両方をキャプチャすることができます。このように、両方が任意に混在することができます。非整列化したら、ダイナミックmap

で、それはあなたのメモリ情報を抽出するために、あなたのデータを処理するために、そして些細です:それはちょうど、よく知られた構造体だとダウンすべての方法をマップ:

var p Payload 
if err := json.Unmarshal([]byte(payload), &p); err != nil { 
    log.Fatal(err) 
} 
for k, node := range p.Nodes { 
    fmt.Printf("%s: %s\n", k, node.Os.Mem) 
} 

Outpu期待通りのts:

Sd2AvEXsswjTn6ErRYjg: map[total_in_bytes:%!s(uint64=163987664) free_in_bytes:%!s(uint64=136357264) used_in_bytes:%!s(uint64=26629400) free_percent:%!s(uint64=84) used_percent:%!s(uint64=16)] 
yzabB-OaTfOqvgAELIMq1Q: map[used_percent:%!s(uint64=99) total_in_bytes:%!s(uint64=623840000) free_in_bytes:%!s(uint64=4127648) used_in_bytes:%!s(uint64=666) free_percent:%!s(uint64=1)] 
q5CdgUF2TRewujr-0RPMgQ: map[total_in_bytes:%!s(uint64=163898764) free_in_bytes:%!s(uint64=139705616) used_in_bytes:%!s(uint64=24194588) free_percent:%!s(uint64=85) used_percent:%!s(uint64=15)] 

+0

は私の問題を修正しました(あなたはもちろん、これが完了するとすぐにPayloadオブジェクトを抽出/最初にデータを再フォーマットし、捨てることは自由です)。ありがとう – mbdvg

関連する問題