2017-12-19 11 views
0

API Rest (Swagger)에서 얻은 json 콘텐츠에서 중첩 값을 얻으려고합니다.스칼라 플레이 Json JSResultException 오류 API

play.api.libs.json.JsResultException: JsResultException(errors:List((,List(ValidationError(error.expected.jsstring,WrappedArray()))))) 

모든 아이디어 :

{ 
    "status": "OK", 
    "ts": 1513600944, 
    "results": { 
    "total": 4, 
    "limit": 100, 
    "page": 1, 
    "numPages": 1, 
    "versions": [ 
     { 
     "id": "consorcio-regional-de-transportes-de-madrid/743/20171127", 
     "f": { 
      "id": "consorcio-regional-de-transportes-de-madrid/743", 
      "ty": "gtfs", 
      "t": "Metro Ligero de Madrid GTFS", 
      "l": { 
      "id": 167, 
      "pid": 166, 
      "t": "Madrid, Spain", 
      "n": "Madrid", 
      "lat": 40.416775, 
      "lng": -3.70379 
      }, 
      "u": { 
      "i": "http://crtm.maps.arcgis.com/home/item.html?id=aaed26cc0ff64b0c947ac0bc3e033196" 
      } 
     }, 
     "ts": 1511848526, 
     "size": 403388, 
     "url": "https://transitfeeds.com/p/consorcio-regional-de-transportes-de-madrid/743/20171127/download", 
     "d": { 
      "s": "20170106", 
      "f": "20180629" 
     }, 
     "err": [], 
     "warn": [] 
     }, 
     { 
     "id": "consorcio-regional-de-transportes-de-madrid/743/20170927", 
     "f": { 
      "id": "consorcio-regional-de-transportes-de-madrid/743", 
      "ty": "gtfs", 
      "t": "Metro Ligero de Madrid GTFS", 
      "l": { 
      "id": 167, 
      "pid": 166, 
      "t": "Madrid, Spain", 
      "n": "Madrid", 
      "lat": 40.416775, 
      "lng": -3.70379 
      }, 
      "u": { 
      "i": "http://crtm.maps.arcgis.com/home/item.html?id=aaed26cc0ff64b0c947ac0bc3e033196" 
      } 
     }, 
     "ts": 1506554131, 
     "size": 403052, 
     "url": "https://transitfeeds.com/p/consorcio-regional-de-transportes-de-madrid/743/20170927/download", 
     "d": { 
      "s": "20170106", 
      "f": "20180925" 
     }, 
     "err": [], 
     "warn": [] 
     }, 
     { 
     "id": "consorcio-regional-de-transportes-de-madrid/743/20170526", 
     "f": { 
      "id": "consorcio-regional-de-transportes-de-madrid/743", 
      "ty": "gtfs", 
      "t": "Metro Ligero de Madrid GTFS", 
      "l": { 
      "id": 167, 
      "pid": 166, 
      "t": "Madrid, Spain", 
      "n": "Madrid", 
      "lat": 40.416775, 
      "lng": -3.70379 
      }, 
      "u": { 
      "i": "http://crtm.maps.arcgis.com/home/item.html?id=aaed26cc0ff64b0c947ac0bc3e033196" 
      } 
     }, 
     "ts": 1495816290, 
     "size": 408985, 
     "url": "https://transitfeeds.com/p/consorcio-regional-de-transportes-de-madrid/743/20170526/download", 
     "d": { 
      "s": "20170106", 
      "f": "20180526" 
     }, 
     "err": [], 
     "warn": [] 
     }, 
     { 
     "id": "consorcio-regional-de-transportes-de-madrid/743/20161012", 
     "f": { 
      "id": "consorcio-regional-de-transportes-de-madrid/743", 
      "ty": "gtfs", 
      "t": "Metro Ligero de Madrid GTFS", 
      "l": { 
      "id": 167, 
      "pid": 166, 
      "t": "Madrid, Spain", 
      "n": "Madrid", 
      "lat": 40.416775, 
      "lng": -3.70379 
      }, 
      "u": { 
      "i": "http://crtm.maps.arcgis.com/home/item.html?id=aaed26cc0ff64b0c947ac0bc3e033196" 
      } 
     }, 
     "ts": 1476308287, 
     "size": 420670, 
     "url": "https://transitfeeds.com/p/consorcio-regional-de-transportes-de-madrid/743/20161012/download", 
     "d": { 
      "s": "20160101", 
      "f": "20170621" 
     }, 
     "err": [], 
     "warn": [] 
     } 
    ] 
    } 
} 
이 문제는 내가이 오류가있다

: 이것은 내가받은 JSON은

val getFeedVersionURL = url("https://api.transitfeeds.com/v1/getFeedVersions?").GET <<? List(
    "key" -> someKey, 
    "feed" -> "consorcio-regional-de-transportes-de-madrid/743", 
    "page" -> "1", 
    "limit" -> "10000", 
    "err" -> "1 (default)", 
    "warn" ->"1 (default)") 

    val response : Future[String] = Http.configure(_ setFollowRedirects true)(getFeedVersionURL OK as.String) 

    val src: String = getFeedVersionURL.toString() 

    response onComplete { 
    case Success(content) => { 
     println("Successful response" + content) 

     //Parse the content 
     val jsonObject = Json.parse(content) 
     //Get url value 
     val fileDownloadURL = (jsonObject \ "results" \ "versions" \ "url").as[String] 
     //Save the file 
     new URL(fileDownloadURL) #> new File("C:/Users//Desktop//file.zip") !! 


    } 
    case Failure(t) => { 
     println("An error has occured: " + t.getMessage) 
    } 
    } 

: 내가 처음 "URL"값에 액세스 할 ?

+0

' "버전"as을 사용하는 것입니다 배열 – cchantep

답변

1

의견에 cchantep이 맞습니다. versions 키를 꺼내 적절하게 처리해야합니다. 여기에 몇 가지 매우 거친 코드는 당신이 원하는 것을 그입니다 :

import play.api.libs.json._ 
val jsonObject = Json.parse(s) // s is that string you gave in your q 

val fileDownloadURL: String = (jsonObject \ "results" \ "versions") match { 
    case JsDefined(JsArray(versions)) => versions.headOption match { 
     case Some(jsValue) => (jsValue \ "url").as[String] 
     case _ => "NOPE hope you got some logic here" 
    } 
    case nope => throw new IllegalArgumentException("handle this better than this!") 
} 

내가 얻을 :

res0: String = https://transitfeeds.com/p/consorcio-regional-de-transportes-de-madrid/743/20171127/download 

참고가 I이, 내 콘솔에 2.4을 재생하여 2.3과 거기에 다른 버전을했다 차이가있을 수 있습니다. 사용중인 게임 버전을 제공하는 경우, 내가하는 일을 성취하는 방법에 대한 좀 더 거친 아이디어를 줄 수 있습니다. 그건 반면

주 일치와 위의 한 방법이라고, 또 다른 방법은 \, versions` 대상으로`기대` "URL"무리에게

val thisToo = (jsonObject \ "results" \ "versions").as[JsArray].value.headOption.map(first => (first \ "url").as[String]).getOrElse(throw new IllegalArgumentException("handle this better than this!")) 
+0

당신이 짝을 지어 주셔서 감사합니다, 당신의 코드는 멋지고 작동합니다. 하지만 변수 (List)에 해당 json의 모든 'url'필드를 저장해야하는 경우 어떻게해야합니까? 나는 butcle을 시도했지만 작동하지 않습니다. –

+0

모든 URL에 대해 .as [JsArray] .value.headOption.map (첫 번째 => (첫 번째 "url").을 [String]으로 변경) .as [JsArray] .value.map first => (첫 번째 "url"). as [String])' – EdgeCaseBerg