2012-09-25 20 views
6

Tengo una aplicación de rieles que obtiene una respuesta de World Weather Online API. Estoy usando la gema rest-client y la respuesta está en formato JSON.Ruby obteniendo datos de API JSON profundamente anidados

que analizar la respuesta usando:

parsed_response = JSON.parse(response) 

Dónde parsed_response es, obviamente, un hash.

Los datos que necesito son cadenas dentro de un hash dentro de un array dentro de un hash dentro de otro array dentro de otro hash dentro de otro hash.

Los valores hash más anidados interiores están dentro de ["hourly"], una matriz de 8 valores hash, cada uno con 20 teclas, que poseen valores de cadena de varios parámetros meteorológicos. Cada uno de estos hashes en la matriz es una hora del día diferente (la previsión es de tres horas, 3 * 8 = 24 horas).

Así, por ejemplo, si quiero que la altura del oleaje en metros a las 9 pm, encuentro con la siguiente llamada:

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

donde el elemento 7 de la matriz corresponde a "time" => "2100"

Mientras Definitivamente puedo trabajar con esto, tengo curiosidad sobre si hay un método más directo para acceder a mis datos, como si fuera una tabla de base de datos, podría usar el registro activo, algo así como:

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

Respuesta

6

Es posible que desee mirar JSONPath. Hace exactamente lo que necesita. Su sintaxis es muy similar a XPath, pero JSONPath funciona con datos JSON (como obvio).

Hay una aplicación Ruby: https://github.com/joshbuddy/jsonpath

Yo personalmente uso que en cada proyecto donde tengo que poner a prueba las respuestas JSON.

+0

cómo puedo encontrar "seleccionado" de esto - "niños" => [{"id" => "10", "texto" => "Nuevas llegadas", "estado" => {"abierto" = > verdadero, "seleccionado" => falso}} – kpp

Cuestiones relacionadas