JsondaはScalaでJSONオブジェクトをエレガントに*1構築するためのDSL、あるいはリテラル的な何かです。
ScalaでJSONオブジェクトを構築するときに、前々から私はイラっと来ていました。もっとも原始的な方法としては、JsonParser*2などを使って、
val person = JsonParser.parse(""" { "name":"Kota Mizushima", "age":28 """)
とする方法があります。しかし、これだとtypoに気づきにくいですし、JSONの一部を別の値で置き換えたいときにとても不便でした。そのために、XMLリテラルを使って
val person = JsonParser.parse(<t> { "name":"Kota Mizushima", "age":{age} </t>.text)
といった事をしてたこともありましたが、途中で<とか>を使いたくなったときにとても面倒なのと、そのためだけにtという無意味なt要素を作るのが嫌でした。あと、typoしやすい問題はやっぱりこれでは解決しません。
lift-jsonにはそのためのDSLがありますが、あまり書きやすくも読みやすくもありませんでした。というわけで、もうちとましなJSON DSL on ScalaとしてJsondaを開発しました。
使い方はとても簡単です。
import org.onion_lang.jsonda.Implicits._ val person = %{ 'name :- "Kota Mizushima" 'age :- 28 }
のように記述するだけです(importは実際にはファイルの先頭に1回書けば良いでしょう)。返ってくる型はlift-jsonのJSONObjectなので、lift-jsonに慣れた人はすぐ使えると思います。
オブジェクトを作るには、%{}
、オブジェクトのkey/valueは、'key :- value
と書くだけでいいという簡単なルールです。JSON配列は、
val jsonArray = $(1, 2, 3, 4, 5)
のように書けます。これはもちろん、Jsondaの一部として混ぜて書くことができます。簡単なドキュメントをおいといたので、使ってみたい人はごらんあれ。
resolver += "kmizu-repo" at "http://kmizu.github.com/maven/" libraryDependencies += "org.onion_lang" %% "jsonda" % "0.0.2"
の2行をbuild.sbtに追加するだけで使えます。内部実装は大したものじゃないのですが、従来のScala用JSON DSLに比べてだいぶ書きやすくなっていると思います。