【问题标题】:Binding Map to Scala properties将 Map 绑定到 Scala 属性
【发布时间】:2014-04-29 19:34:34
【问题描述】:

我有一个json数据

{"query":{"count":1,"created":"2014-04-28T07:33:09Z","lang":"en-US","re​​sults":{"rate": {"id":"USDCNY","Rate":"6.2489","Date":"4/28/2014","Time":"3:30am","Ask":"6.2494","Bid" :"6.2484"}}}}

从上面,

我只对

感兴趣

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

}

我得到如下输出

Map(Rate -> 6.2532, Ask -> 6.2531, id -> USDCNY, Bid -> 6.2533, Date -> 2014 年 4 月 28 日,时间 -> 早上 6:15)

从这里,

如何将 Map 绑定到 scala 属性,

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

提前致谢

【问题讨论】:

  • 请详细说明您正在尝试什么以及您已经尝试过什么。您使用的是什么 JSON 库(或者您只是将这些数据作为字符串处理)?您要提取哪种 Scala 对象?
  • 希望现在我的问题有点意义......
  • @BalaB 我已根据您提供的其他详细信息更新了我的答案。

标签: json scala


【解决方案1】:

有很多不同的方法可以做到这一点,这里是使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2014-03-22
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多