2017-05-28 77 views
0

我是新來斯卡拉創建變量,我試圖在地圖解析如下解析Scala中的一個JSON和每個關鍵

val result = JSON.parseFull(""" 
    {"name": "Naoki", "lang": ["Java", "Scala"] , "positionandvalue": ["5:21", "6:24", "7:6"]} 
""") 
result: Option[Any] = Some(Map(name -> Naoki, lang -> List(Java, Scala), positionandvalue -> List(5:21, 6:24, 7:6))) 

所示的JSON,並得到解析值

val myMap = result match { 
    case Some(e) => e 
    case None => None 
} 
myMap: Any = Map(name -> Naoki, lang -> List(Java, Scala), positionandvalue -> List(5:21, 6:24, 7:6)) 

我需要的是 1.將密鑰作爲一個新變量(用作驗證文件的元數據)及其相應的值分配給它。像,

val name = "Naoki" 
  • positionandvalue - >列表(5:21,6:24,7:6)。這個變量表示列表(字符串的位置在文件中的定位:位置中的字符串的長度)。我如何使用這個變量來滿足要求。
  • +0

    對不起。無法準確理解這裏需要的東西。你可以請重新說明要求嗎? –

    回答

    0

    您無法從Map鍵動態創建變量namepositionandvalue。但是,它們可以使用以下方法靜態創建。

    val result: Option[Any] = Some(Map("name" -> "Naoki", "lang" -> List("Java", "Scala"), "positionandvalue" -> List("5:21", "6:24", "7:6"))) 
    
    val myMap: Map[String, Any] = result match { 
        case Some(e: Map[String, Any] @unchecked) => e 
        case _ => Map() 
    } 
    
    val name = myMap.get("name") match { 
        case Some(x: String) => x 
        case _ => throw new RuntimeException("failure retrieving name key") 
    } 
    
    val positionandvalue = myMap.get("positionandvalue") match { 
        case Some(x: List[String] @unchecked) => x.map(y => (y.split(":") match {case Array(x1,x2) => x1 -> x2})).toMap 
        case _ => throw new RuntimeException("failure retrieving positionandvalue key") 
    } 
    
    positionandvalue: scala.collection.immutable.Map[String,String] = Map(5 -> 21, 6 -> 24, 7 -> 6) 
    
    +0

    謝謝你,無賴。另外,對於我的第二個問題,變量positionandvalue是一個包含鍵值對的列表。我怎樣才能將它提取爲一個像Map一樣的關鍵值對? –

    +0

    @BalakrishnanRamasamy更新了答案。 'positionandvalue'現在是一個Map [String,String]。讓我知道如果這是通緝 –