Scala Play Json JSResultException错误API
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala Play Json JSResultException错误API相关的知识,希望对你有一定的参考价值。
我试图从API Rest(Swagger)获得的json内容中获取嵌套值。我想访问第一个“url”值:
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)
}
}
这是我收到的json:
{
"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": []
}
]
}
}
问题是我收到此错误:
play.api.libs.json.JsResultException: JsResultException(errors:List((,List(ValidationError(error.expected.jsstring,WrappedArray())))))
有任何想法吗?
答案
评论中的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
请注意,我在我的控制台中使用play 2.4执行此操作,而对于2.3和其他版本,可能会有差异。如果你提供你正在使用的游戏版本,我可能会给你一些关于如何完成你所做的更粗略的想法。
注意上面的匹配是一种方式,另一种方式是使用as
一堆
val thisToo = (jsonObject "results" "versions").as[JsArray].value.headOption.map(first => (first "url").as[String]).getOrElse(throw new IllegalArgumentException("handle this better than this!"))
以上是关于Scala Play Json JSResultException错误API的主要内容,如果未能解决你的问题,请参考以下文章
scala play json 找不到 unapply 或 unapplySeq 函数
Scala Play Json JSResultException错误API