2012-09-25 17 views
6

Ho un'app per rails che riceve una risposta dall'API World Weather Online. Sto usando la gemma rest-client e la risposta è in formato JSON.Ruby che ottiene dati API JSON profondamente annidati

ho analizzare la risposta utilizzando:

parsed_response = JSON.parse(response) 

Dove parsed_response è ovviamente un hash.

I dati di cui ho bisogno sono stringhe all'interno di un hash all'interno di un array all'interno di un hash all'interno di un altro array all'interno di un altro hash all'interno di un altro hash.

Gli hash nidificati più interni sono all'interno di ["hourly"], una matrice di 8 hash, ciascuno con 20 chiavi, in possesso di valori stringa di vari parametri meteorologici. Ognuno di questi hash nell'array è una diversa ora del giorno (la previsione è di tre ore, 3 * 8 = 24 ore).

Così, per esempio, se voglio l'altezza onde in metri in 9:00, lo trovo con la seguente chiamata:

@swell_height = parsed_data["data"]["weather"][0]["hourly"][7]["swellHeight_m"] 

Laddove l'elemento 7 ° nella matrice corrisponde a "time" => "2100"

Mentre posso sicuramente lavorare con questo, io sono curioso di vedere se c'è un metodo più semplice di accedere ai miei dati, come se si trattasse di una tabella di database, potrei usare record attivo, qualcosa di simile:

@swell_height = parsed_data.swellHeight_m.where(:time => "2100") 

risposta

6

Si consiglia di guardare JSONPath. Fa esattamente quello che ti serve. La sua sintassi è molto simile a XPath, ma JSONPath funziona con i dati JSON (come ovvio).

C'è un'implementazione di Ruby: https://github.com/joshbuddy/jsonpath

Io personalmente uso in ogni progetto in cui ho bisogno di testare le risposte JSON.

+0

come posso trovare "selezionato" da questo - "bambini" => [{"id" => "10", "testo" => "Nuovi arrivi", "stato" => {"aperto" = > true, "selected" => false}} – kpp

Problemi correlati