2017-03-06 75 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