このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

Jsonic型システム:ユーザー定義のスカラー型

※ 後で本編に移す。

JSONスカラー型には、日付時刻や金額などの型がありません。将来的に仕様に導入される可能性はありますが、当面は必要な型をーザー定義して利用することになります。型をユーザー定義できるメカニズムが必要です。ここでは、スカラー型についてだけ述べます。複合型のユーザー定義については別な機会に述べます。

表現空間

JSONにユーザー定義型を導入するとはいっても、JSON構文から逸脱するのは論外なので、構文的な型式としては、JSONの範囲内に収めます。しかし、意味的にはJSON仕様にはない型を定義することになります。

このような状況をスッキリと説明するために、"XML Schema Datatypes"仕様では、字句空間(lexical space)と値空間(value space)という概念を使っています。これに倣い、JSONベース型システムでも、構文表現の空間と値の空間を区別することにします。ただし、「字句空間」の代わりに「表現空間」(representation space)という用語を使うことにします。「空間」という語に図形的な意味は何もなく、値の集合と同義です。

ユーザー定義型の表現空間は、既存のJSONスカラー型でなくてはなりません。例えば、テストの点数を表す型scoreをユーザー定義するとき、点数は整数で表現するのが妥当でしょうから、表現空間にはintegerを選びます。郵便番号を表す型zipCodeの場合は、文字列で表現するなら表現空間はstring、もし整数値にエンコードして表現するなら表現空間はintegerです。

ユーザー定義型のインスタンスも、その表現はJSONスカラー値となります。例えば、テストの点数47点は、整数 47 で表現されます。郵便番号153-0051は文字列 "153-0051" で表現されます。表現のレベルでは、必ずJSONインスタンスなのです。

タグ付き値

表現を見ただけでは、テストの点数47点と単なる整数47、 郵便番号153-0051と単なる文字列"153-0051"との区別はできません。与えられた表現、例えば 47 や "153-001" が特定のユーザー定義型のインスタンスであることを示すには、次の2つの方法があります。

インスタンス内に書き込まれたタイプ情報(を示唆する名前)をタグと呼びます。XML要素のタグ名と類似の概念です。ただし、スカラーに対してもタグを付けることができます。タグ付き(メタ情報付き)の値をタグ付き値(tagged value)と呼びます。

タグ名の構文は次のとおり:

  • TagName ::= [a-zA-Z][a-zA-Z0-9]*

タグ付き値は、次のようにJSONオブジェクト形式にエンコードされます。


{
"$tag" : "score",
"$val" : 47
}

{
"$tag" : "zipCode",
"$val" : "153-0051"
}

ドルマークからはじまる特殊なプロパティ名を使っています。「特殊」とは言ってもコンベンション(お約束)のレベルでのことです。ドルマークからはじまるプロパティ名はシステム側で予約するよ、ってこと。

$tag がない {"$val" : 47} は単なるスカラー 47 と同義です。$tagだけがあって $val がないときは undefined ですが、JSON内でundefinedを明白に表現はできないのでエラーです。

見てのとおり、タグ付き値を人が読み書きするのは愉快ではありません。説明のときは、次の形で書くことにします。

  • '(' タグ名 ')' 値の表現

例えば、(score)47, (zipCode)"153-0051" など。丸括弧を使ったのは、プログラミング言語のキャストとの類似からです。このキャスト風記法は、単なる説明用ではなくて、生のJSON構文の上位構文として採用するかもしれません(まだ未定)。