Simple JSON Library for Java

非常にシンプルな1クラス/1ファイルのJSONデコード/エンコードクラスを作ってみた。Java用のJSONライブラリはすでにあるのだけど、出力されるJSONJavaに依存していたりクラス数が多かったりと使い辛い面があったので車輪の再発明をしてみました。ライセンスは、Apache License 2.0で配布しますので適当に使ってください(パッケージ名を適当に変えて自分のパッケージに組み込んでもらって構わんです)。

json-0.8.zip(最新版はここより入手ください)

一応、テストケースは通っているが自信がないので、しばらく自分で使ってみて問題ないようであれば1.0にあげるかにゃー、という感じ。

[2007/03/04追記] JavaBeansからjson object変換時にpublicなpropertyとfieldのみを対象にするよう仕様を変更(同名のpropertyとfieldがある場合はpropertyが優先)。versionも0.8に変更。

[2007/02/18追記] Localeクラスの仕様を勘違いしていたことによるバグを修正。Calendarクラスへの対応を追加。また、JavaBeansからJSONへの変換の際にstaticメソッドも調べていたのでインスタンスのメソッドのみ調べるように修正。同じくJavaBeansからの変換時に自分を戻すメソッドがある場合に無限で循環してしまう問題があったため修正。versionも0.7に上げた。

[2007/02/11追記] テストケース増やしてみたら、charのケースでencodeに失敗していたので修正。versionも0.6に上げた。

使い方はこんな感じ。

// JavaのオブジェクトをJSONに変換します。
String s = Json.encode(o);

// JSONをJavaのオブジェクトに変換します
//(エラー時は、java.text.ParseException吐きます)
Object o = Json.decode(s);

スペックはこんな感じです。

encode時(JavaからJson)の変換ルール

java type json type
java.util.Mapobject
java.lang.Object (public propertyあるいはfieldが対象)
java.lang.Objectarray
java.util.Collection
boolean, byte, short, int, long, float, double
java.lang.Stringstring
char[]
java.lang.Character
char
java.util.Localestring (言語コード-国コード)
java.lang.Numbernumber
byte, short, int, long, float, double
java.util.Datenumber (1970年からのミリ秒)
java.util.Calendar
java.lang.Booleantrue/false
boolean
nullnull

decode時(JsonからJava)の変換ルール

json type java type
objectjava.util.HashMap
arrayjava.util.ArrayList
stringjava.lang.String
numberjava.math.BigDecimal
true/falsejava.lang.Boolean
nullnull