2012-12-19 15 views
6

Próbuję przeanalizować niektóre json w strukturze gry ze zdalnej odpowiedzi http. Próbuję uzyskać wyniki [0] -> lokalizacje [0] -> latLng-> łac. Używam playframework 2.0 z scala.Przechodzenie do JSON Arrays w Play Framework

Poniżej znajduje się kod, którego używam, z kilkoma skomentowanymi przykładami tego, co dotychczas wypróbowałem.

val promise = WS.url("http://www.mapquestapi.com/geocoding/v2/address?...").get() 
    val body = promise.value.get.body 
    val json = Json.parse(body) 
    val maybeLat = (json \ "results" \ "0" \ "locations" \ "0" \ "latLng" \ "lat").asInstanceOf[String] 
    //val maybeLat = (json \ "results[0]" \ "locations[0]" \ "latLng" \ "lat").asInstanceOf[String] 
    //val maybeLat = (json \ "results(0) \ "locations(0) \ "latLng" \ "lat").asInstanceOf[String] 

    Ok(body).withHeaders(CONTENT_TYPE -> "text/json") 

Błędy Dostaję od ram Play: http://pastebin.com/S5S3nY5D JSON, który próbuję analizować: http://pastebin.com/7rfD0j2n

Odpowiedz

6

myślę dużo lepszym rozwiązaniem byłoby:

val resultsArray = (json \ "results").as[JsArray] 
val locations = resultsArray \\ "locations" 

w tym momencie, locations będzie lista obiektów, które można przemierzać, bez konieczności uzyskiwania dostępu do nich ręcznie poprzez ich indeks.

8

Spróbuj tego, porządkowa dostęp musi być po drogi ruchu.

val result = (json \ "results")(0) 
val location = (result \ "locations")(0) 
val lat = (location \ "latLng" \ "lat") 

Dzięki temu można zbudować rozwiązanie jedną linię:

(((json \ "results")(0) \ "locations")(0) \ "latLng" \ "lat") 
+0

jednoliniowe rozwiązanie działało pięknie. tyvm – Commander

+0

To dość denerwujący sposób na zrobienie tego - czy jest jeszcze inaczej? –

+0

co, jeśli nie znam pozycji lokalizacji w mojej tablicy? –