json4sを使ってみた
用意したjsonは
gist.github.com
pythonで生成したら日本語が...
とりあえずjson4sを使うためにbuild.sbtに
libraryDependencies += "org.json4s" %% "json4s-jackson" % "3.5.0"
とした.
URLからjsonを取ってきてjson4sでパースし,shigureに対応する要素を出力ということをしてみた
import scala.io.Source import org.json4s._ import org.json4s.jackson.JsonMethods._ object Main{ def main(args:Array[String])={ val url = "https://gist.githubusercontent.com/chakku000/ea3bce545c397b2bbc3f211e074847d1/raw/fc0744f530bf993a5c059254a8101adc650d11ec/poi.json" val source : scala.io.BufferedSource = scala.io.Source.fromURL(url) val contents : String = source.mkString val json = parse(contents) // JsonのAST表現 val maps = json.values.asInstanceOf[Map[String,Any]] // JsonのAstをMapに変換 val shigure = getFromOption(maps.get("shigure")) println(shigure) } def getFromOption(v : Option[Any]) : String = { v match{ case Some(s) => s.asInstanceOf[String] case None => "" } } }
となった.
いくつかわからないことがあった.
一つは json.values.getClassとするとscala.collection.immutable.Mapとでるのでgetができるかと思ったが,json.values.getとするとjson.Valuesのメンバじゃないと怒られてしまう.なんでだろう?
感想
Scalaを初めてみたが,コップ本も詰んであるままなので読まないと....
質問できる人がほしい...
追記1
json.Valueにgetメンバがないと怒られるのは,json.valuesの型が静的にはMapして解釈できないのでは?という指摘を受けた.asInstanceOfで明示的に型を指定すれば静的にMap型として解釈できるのではというものである.
追記2
上のコードはもう少し簡単にできるらしいです.こんな感じで
import scala.io.Source import org.json4s._ import org.json4s.jackson.JsonMethods._ object Main{ def main(args:Array[String])={ val url = "https://gist.githubusercontent.com/chakku000/ea3bce545c397b2bbc3f211e074847d1/raw/fc0744f530bf993a5c059254a8101adc650d11ec/poi.json" val source : scala.io.BufferedSource = scala.io.Source.fromURL(url) val contents : String = source.mkString val json = parse(contents) // JsonのAST表現 //val maps = json.values.asInstanceOf[Map[String,Any]] // JsonのAstをMapに変換 implicit val formats = DefaultFormats val shi : String = (json \ "shigure").extract[String] println(shi) } }