val text = """{ "x":1 }"""; val result = JSON.parseFull(text); val map = result.get.asInstanceOf[Map[String, Option[Any]]]; println (map.get("x").get); -------------------- 1.0scala.util.parsing.json.Parser クラスで
// Global default number parsing function protected var defaultNumberParser : NumericParser = {_.toDouble}と定義されているので、数値が常に String.toDouble とパースされてしまうのが原因。
scala.util.parsing.json.JSON オブジェクトには 数値パーサを変更するメソッドが用意されている。
def globalNumberParser_=(f: NumericParser) { defaultNumberParser = f }これを使うことで Int 型と Double 型を切り替えて解釈するようにできる。
JSON.globalNumberParser = (in) => {try in.toInt catch {case _ => in.toDouble}} val text = """{ "x":1, "y":1.0 }"""; val result : Option[Any] = JSON.parseFull(text); val map = result.get.asInstanceOf[Map[String, Option[Any]]]; println ("x: " + map.get("x").get); println ("y: " + map.get("y").get); -------------------- x: 1 y: 1.0
ちなみに、「def globalNumberParser_=(f: NumericParser) 」は、 「globalNumberParser_=」がメソッド名。 Scala では、「XXXXX_=(引数)」形式の関数は「XXX = 引数」という代入形式で呼び出せるというルールがある。
一見わかりにくいので注意。
0 件のコメント:
コメントを投稿