2014-04-28 54 views
-2

我有一個JSON數據作爲結合地圖Scala的性質

{ 「查詢」:{ 「計數」:1, 「創建」: 「2014-04-28T07:33:09Z」,「朗「:」 EN-US」, 「結果」:{ 「速度」:{ 「ID」: 「美元兌人民幣」, 「價」: 「6.2489」, 「日期」: 「2014年4月28日」, 「時代」: 「凌晨3:30」, 「問」: 「6.2494」, 「投標」: 「6.2484」}}}}

從上面,

我只是在很感興趣

{「id」:「USDCNY」,「費率」:「6.2489」,「日期」:「4/28/2014」,「時間」:「上午3點30分」,「詢問」:「6.2494」,「 「:」 6.2484" }

數據

我提取它作爲一個地圖,

val translateAPI = url(yahooFinanceApiUrl) 
    val response = Http(translateAPI OK as.String) 

    response onComplete { 
    case Success(json) => parser(json) 
    case Failure(error) => println(" Error " +error) 
    } 


    def parser(data:String) = { 

    val languages = JSON.parseFull(data) match { 
    case Some(x:Map[String, Map[String, Map[String, Any]]]) => { 
    (x.get("query")).last.get("results").last.get("rate").last 
    } 
    case None => Nil 
} 

println(languages) 

}

我輸出如下

地圖(RA TE - > 6.2532,賣出 - > 6.2531,ID - >美元兌人民幣,投標 - > 6.2533,日期 - > 2014年4月28日,時間 - >上午6:15)

從這裏,

我如何可以綁定一個Map階特性,

類貨幣(匯率:字符串,問:字符串ID:字符串,出價:字符串, 日期:字符串,時間:字符串)

在此先感謝

+1

請出示什麼你試圖和你已經嘗試更多的細節。你使用的是什麼JSON庫(或者你只是將這些數據作爲字符串處理)?你想要提取什麼類型的Scala對象? – DNA

+0

希望我現在的問題有一定道理...... – BalaB

+0

@BalaB我已根據您提供的其他詳細信息更新了我的答案。 – godfatherofpolka

回答

3

有很多不同的方式來做到這一點,這是一個簡單的使用Argonaut。對於在斯卡拉處理JSON更多的方式,請參閱What JSON library to use in Scala?How to parse JSON in Scala using standard Scala classes?

import argonaut._, Argonaut._ 

case class Rate(id : String, rate : Double, date : java.util.Date, ask : Double, bid : Double) 
object Rate {  
    val dateFormat = new java.text.SimpleDateFormat("M/d/yyyy h:mma") 

    implicit def RateDecodeJson : DecodeJson[Rate] = 
    DecodeJson(cursor => { 
     val c = cursor --\ "query" --\ "results" --\ "rate" 
     for { 
     /* you can also access other fields of the JSON here, e.g. 
     * lang <- (cursor --\ "query" --\ "lang").as[String].map(new java.util.Locale(_)) 
     */ 
     id <- (c --\ "id").as[String] 
     rate <- (c --\ "Rate").as[String].map(_.toDouble) 
     date <- (c --\ "Date").as[String] 
     time <- (c --\ "Time").as[String] 
     ask <- (c --\ "Ask").as[String].map(_.toDouble) 
     bid <- (c --\ "Bid").as[String].map(_.toDouble) 
     } yield Rate(id, rate, dateFormat.parse(date + " " + time), ask, bid)}) 
} 

object ArgonautExample extends App{ 
    val json = """{ 
     "query":{ 
     "count":1, 
     "created":"2014-04-28T07:33:09Z", 
     "lang":"en-US", 
     "results":{ 
      "rate":{ 
      "id":"USDCNY", 
      "Rate":"6.2489", 
      "Date":"4/28/2014", 
      "Time":"3:30am", 
      "Ask":"6.2494", 
      "Bid":"6.2484" 
      } 
     } 
     } 
    }""" 

    val rate = Parse.decodeOption[Rate](json).get 
    println(rate) 
} 

注意:您可能要處理的日期和時間在一個稍微複雜的方式,例如,使用的語言環境等

如果您不介意的Rate是所有String類型(這是什麼JSON提供他們作爲)的領域,你也可以使用簡單的版本

case class Rate(id : String, rate : String, date : String, time : String, ask : String, bid : String) 
object Rate { 
    implicit def RateCodecJson : CodecJson[Rate] = 
    casecodec6(Rate.apply, Rate.unapply)("id", "Rate", "Date", "Time", "Ask", "Bid") 
} 

,然後首先分析整個JSON

val parsedJson = Parse.parseOption(json).get 

和訪問和解碼相關的部分

val rateJson = (parsedJson -|| List("query", "results", "rate")).get 
val rate = rateJson.as[Rate].value.get