我有一个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, 日期:字符串,时间:字符串)
提前致谢
答案 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