我有一个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