将Map绑定到Scala属性



我有一个json数据作为

{"query":{"count":1,"created":"2014-04-28T07:33:09Z","lang":"en-US","results":{

从上面看。,

我只对感兴趣

{"id":"USDCNY","Rate":"6.2489","Date":"4/28/2014","Time":"3:30 am","Ask":"62.494",《Bid》:"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)

}

我得到的输出如下

地图(价格->6.2532,要价->6.2531,id->USDCNY,出价->6.2533,日期->2014年4月28日,时间->上午6:15)

从这里开始,

如何将Map绑定到scala属性,

class Currency(Rate:String,Ask:String,id:String,Bid:String,日期:字符串,时间:字符串)

提前感谢

有很多不同的方法可以做到这一点,这里有一个使用Argonaut的简单方法。有关在Scala中处理JSON的更多方法,请参阅Scala中要使用什么JSON库?以及如何使用标准Scala类在Scala中解析JSON?

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

最新更新