将映射绑定到Scala属性

时间:2014-04-28 07:40:41

标签: json scala

我有一个json数据

  

{ “查询”:{ “计数”:1, “创建”: “2014-04-28T07:33:09Z”, “朗”: “的en-US”, “结果”:{ “速率”: { “ID”: “美元兑人民币”, “价”: “6.2489”, “日期”: “2014年4月28日”, “时代周刊”: “凌晨3:30”, “问”: “6.2494”, “投标” : “6.2484”}}}}

从上面。,

我只对

感兴趣
  

{ “ID”: “美元兑人民币”, “价”: “6.2489”, “日期”: “2014年4月28日”, “时代周刊”: “凌晨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)

}

我输出如下

  

地图(费率 - > 6.2532,询问 - > 6.2531,id - > USDCNY,买入价 - > 6.2533,日期    - > 2014年4月28日,时间 - >上午06时15)

从这里开始,

如何将Map绑定到scala属性

  

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

提前致谢

1 个答案:

答案 0 :(得分:3)

有很多不同的方法可以做到这一点,这是一个使用Argonaut的简单方法。有关在Scala中处理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