2016-04-14 3 views
0

Я новичок, и я пытаюсь извлечь конкретный ключ из json-структуры, как показано ниже.Получить данные из вложенных динамических клавиш json в golang

{ 
    "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

Хорошая ссылка, чтобы узнать, как обрабатывать данные в Go: http://blog.golang.org/json-and-go

Что касается вашей проблемы, мне кажется, как ваши данные относительно хорошо структурированы ... Я поставил пример извлечения mem части каждого узла в следующем примере площад:

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

суть ее в том, что все, что сильно указано может быть закодирован как struct с. Что такое динамическое (например, имена ваших узлов), могут быть закодированы как карты. Оба они могут быть произвольно перемешаны, так что это:

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

Once unmarshalled, это то тривиально обрабатывать ваши данные для извлечения вашей информации памяти: это просто хорошо известная и карты Структуры всего пути вниз:

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 ц, как и ожидалось:

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)] 

(Вы, конечно, бесплатно, чтобы извлечь/переформатировать данные первого и канавы Payload объект, как только это полная)

+0

решить мою проблему. благодаря – mbdvg

Смежные вопросы