SCALA:使用提供的路径读取JSON文件

时间:2017-03-06 06:48:47

标签: scala

我有一个场景,我将从多个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"
  } ]
}

1 个答案:

答案 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