JSONは便利なデータ表現なんだけど、
- 型情報が付加できない
- ハッシュのキーに引用符を付けるのがイヤ
という理由で(2番目はあまり本質的ではないけど)、JSON改(後でXionに改名)というデータ表現を提案しました*1。
JSON:
{ "familyName" : "板東", "givenName" : "トン吉", "age" : 27, "sex" : "male", "company" : { "name" : "(株)東西トラベル", "url" : "http://www.example.jp/tozai-travel/" }, "hobbies" : ["盆栽", "釣り", "版画"] }
JSON改(Xion):
Person { familyName : "板東", givenName : "トン吉", age : 27, sex : Sex "male", company : Company { name : "(株)東西トラベル", url : URL "http://www.example.jp/tozai-travel/" }, hobbies : ["盆栽", "釣り", "版画"] }
JSON改の表現では、Person, Sex, Company, URLがデータ型を示す識別子(型名、ソート)です。
実は既に、JSON改とソックリなデータ表現があるんですよね(すぐ下)。
@Person ( familyName = "板東", givenName = "トン吉", age = 27, sex = Sex.male, company = @Company ( name = "(株)東西トラベル", url = @URL("http://www.example.jp/tozai-travel/") ), hobbies = {"盆栽", "釣り", "版画"} )
これは何かって? Javaのアノテーションです :-) 。単にデータインスタンスをリテラル表記できるだけじゃなくて、きっちりとスキーマ(データ型)定義もできるし、妥当性検証までしてくれます。まー、なんて素敵なんでしょ!
enum Sex {male, female} @interface URL { String value(); } @interface Company { String name() default ""; URL url() default @URL(""); } @interface Person { String familyName(); String givenName(); int age(); Sex sex(); Company company() default @Company(); String[] hobbies() default {}; } @Person ( familyName = "板東", givenName = "トン吉", age = 27, sex = Sex.male, company = @Company ( name = "(株)東西トラベル", url = @URL("http://www.example.jp/tozai-travel/") ), hobbies = {"盆栽", "釣り", "版画"} ) public class Foo { }
残念なのは、データ表現をクラスとかメソッドにひっつけないと使えないことです。それでもまー、名簿を次にように書けます。
public class People { @Person ( familyName = "板東", givenName = "トン吉", age = 27, sex = Sex.male ) public void tonkichi(){}; @Person ( familyName = "大垣", givenName = "ペケ子", age = 21, sex = Sex.female ) public void pekeko(){}; // // ... // }
クラスファイルがデータストレージになりますぜ。誰かリフレクションを使って、データノードをたどるDOM風APIと、検索をするSQL風問い合わせ言語を作ってくれませんかねぇ。
*1:より詳しくは、「JSON改:XMLとの比較」、「JSON改:基本構文」も参照。