kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Jsonda 0.0.2をリリースしました

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に比べてだいぶ書きやすくなっていると思います。

*1:主観的ですがw

*2:lift-jsonに同梱