2017-03-06 86 views
1

我有我将从多个API获取不同JSON结果的场景,我需要从响应中读取特定值。SCALA:使用提供的路径读取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

您可以使用scala JSON解析器获取json的关键字,如下所示。我定义了一个函数来获取经纬度,您可以根据需要对其进行通用化处理,以便您只需更改函数即可。

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。

希望它有帮助。但是有更好的APIs,比如Play JSON lib。你根本无法使用,

import play.api.libs.json._ 

val jsonVal = Json.parse(json) 
val lat = (jsonVal \ "location" \ "lat").get 
+0

我以前玩库,但它并不满足,因为我说我写广义的程序,从JSON获得价值为目的,所以我不知道什么JSON路径的使用是要的提供,我正在寻找的东西,其中用户提供商的JSON路径,我可以提取价值使用 –

+0

你能给我一个格式什么你的传入键看起来像? – prayagupd

相关问题