2012-12-19 17 views
6

Tôi đang cố gắng phân tích cú pháp thông qua một số json trong khung chơi từ một phản hồi http từ xa. Tôi đang cố gắng để có được kết quả [0] -> địa điểm [0] -> latLng-> lat. Tôi đang sử dụng playframework 2.0 với scala.Bước vào các mảng JSON trong khung chơi

Dưới đây là mã tôi đang sử dụng với một vài ví dụ đã nhận xét về những gì tôi đã thử cho đến nay.

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

lỗi tôi nhận được từ play framework: http://pastebin.com/S5S3nY5D JSON rằng tôi đang cố gắng để phân tích: http://pastebin.com/7rfD0j2n

Trả lời

6

Tôi nghĩ rằng một cách tốt hơn sẽ là:

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

vào thời điểm này, locations sẽ là một danh sách các đối tượng mà bạn có thể duyệt qua mà không phải truy cập chúng theo cách thủ công thông qua chỉ mục của chúng.

8

Hãy thử điều này, truy cập thứ phải sau con đường đi qua.

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

Với điều này, bạn có thể xây dựng của bạn giải pháp một dòng:

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

giải pháp một dòng hoạt động tốt đẹp. tyvm – Commander

+0

Đó thực sự là một cách khá khó chịu để làm điều đó - có cách nào khác không? –

+0

nếu tôi không biết vị trí của vị trí trong mảng của tôi thì sao? –