我有一个场景,我将从多个API获得不同的JSON结果,我需要从响应中读取特定值。
例如我的JSON响应如下,现在我需要一个从用户到提供者的格式,通过它我可以读取Lat的值,不想要硬编码的方法,用户可以提供一个节点来读取其他一些json文件或txt文件:
{
"name" : "Watership Down",
"location" : {
"lat" : 51.235685,
"long" : -1.309197
},
"residents" : [ {
"name" : "Fiver",
"age" : 4,
"role" : null
}, {
"name" : "Bigwig",
"age" : 6,
"role" : "Owsla"
} ]
}
答案 0 :(得分:1)
您可以使用scala JSON解析器获取json的密钥,如下所示。我定义了一个函数来获取lat,你可以根据自己的需要制作一般函数,这样你只需要改变函数。
import scala.util.parsing.json.JSON
val json =
"""
|{
| "name" : "Watership Down",
| "location" : {
| "lat" : 51.235685,
| "long" : -1.309197
| },
| "residents" : [ {
| "name" : "Fiver",
| "age" : 4,
| "role" : null
| }, {
| "name" : "Bigwig",
| "age" : 6,
| "role" : "Owsla"
| } ]
|}
""".stripMargin
val jsonObject = JSON.parseFull(json).get.asInstanceOf[Map[String, Any]]
val latLambda : (Map[String, Any] => Option[Double] ) = _.get("location")
.map(_.asInstanceOf[Map[String, Any]]("lat").toString.toDouble)
assert(latLambda(jsonObject) == Some(51.235685))
功能的扩展版本,
val latitudeLambda = new Function[Map[String, Any], Double]{
override def apply(input: Map[String, Any]): Double = {
input("location").asInstanceOf[Map[String, Any]]("lat").toString.toDouble
}
}
使函数具有通用性,这样一旦你知道你想从JSON中得到什么键,只需更改函数并应用JSON。
希望它有所帮助。但是有更好的API,如Play JSON lib。你可以使用,
import play.api.libs.json._
val jsonVal = Json.parse(json)
val lat = (jsonVal \ "location" \ "lat").get