「JSONスキーマ属性とその適用対象の一覧 2010年春・編」から引用:
僕は、JSONでもBase64エンコードのbinary型をネイティブ・サポートすべきだと思っています。XML Schema Part 2: Datatypes ではバイナリデータをサポートしてます(http://www.w3.org/TR/xmlschema-2/#base64Binary)。バイナリがあれば、"format" : "image/gif" のようなスキーマ属性指定にも意味を持たせられます。
JSONにバイナリデータを導入するとき、最初に問題になるのは「通常の(まったく拡張してない)JSONへのマーシャリング」です。
JSONにメタデータや特殊な構文構成素を記述するときは、ドル記号('$')で始まる名前のプロパティを使うことが、ある程度は慣例となっているので、この方法を使うことにします。次の形をバイナリデータの表現とします。
{"$data" : "ここにテキストにエンコードしたバイナリデータ"}
最初僕は、バイナリデータの型を表すために $type というプロパティも考えていましたが、別な方法を採用します。プロパティ値に、data: URIスキーム(http://en.wikipedia.org/wiki/Data_URI_scheme)のURI文字列をそのまま使います。次にようになります。
{"$data" : "data:image/jpeg;base64, ここにBase64エンコードしたバイナリデータ"}
メタデータとしての型は、プロパティ値の先頭に埋め込まれます。「data」という綴りの語が二回出てきて冗長ですが、この2つは役割が違います。$data はJSON処理系がバイナリデータを認識するための目印です。一方、値の先頭の data: は、この文字列がdata:スキームURIであることを伝えます。$dataプロパティの値を取り出して、それをそのままdata:スキームを理解できる処理系に渡せば、対応するバイナリオブジェクト(例えばJPEG画像)が得られるでしょう。
スキーマ定義の際には、JSONスキーマ属性formatが使えます。本家JSONスキーマ構文なら、次のような記述となります。
{ "type" : "binary", "format" : "image/jpeg" }
Catyスキーマ構文なら:
binary(format = "image/jpeg")