ちゃっくのメモ帳

ちゃっくがメモしときたいことをメモしとくよ

json4sを使ってみた

scalajsonを扱いたいと思ったのでやったことのメモ

用意した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)
  }
}