/note/tech

TSON (Typed Schema Object Notation)

要約:

■ 1. TSONの概要

  • TSONの定義:
    • Typed Schema Object Notationの略称
    • JSONの上位互換でありながら、より堅牢なスキーマ検証の仕組みを提供することを目指す
  • TSONを構成する2要素:
    • 不変・ハッシュ固定のスキーマシステム
    • Unicode対応のJSONスーパーセットとなるデータフォーマット
  • ハッシュ値によるチェーン検証:
    • ドキュメントが自身のスキーマを指定し、そのスキーマがさらにメタスキーマを指定する構造を取る
    • たった一つのハッシュ値でチェーン全体を検証できる点が最大の特徴

■ 2. スキーマの不変性

  • スキーマは変更しないという原則:
    • TSONの設計思想で最もユニークな点
  • 必須フィールド追加の扱い:
    • 通常のAPI設計では、必須フィールドを後から追加することは破壊的変更となるため一般的に禁止されている
    • Google、Microsoft、Zalandoなどのガイドラインでも言及されている
  • 新バージョンを新ドキュメントとして扱う方式:
    • 新しいバージョンは新しいハッシュを持つ新しいドキュメントとして扱う
    • 新旧スキーマが同時に共存でき、後方互換性の問題を回避できる
  • 未知フィールドの扱い:
    • 未知のフィールドは常にエラー扱いとする
    • タイポなどをその場で検出するための設計

■ 3. スキーマ記法の主な機能

  • フィールドの5状態:
    • 必須、デフォルト値(~)、固定値(=)、オプション(?)などを明示的に宣言する
  • 型付けの対象:
    • 配列、タプル、セットを型付けできる
  • 列挙型と制約付きアトム:
    • 列挙型(enum)を利用でき、^で制約を追加した制約付きアトムも定義できる
  • 合成(composition):
    • &で型を組み合わせ、フィールドの重複を許さない
  • 精密化(refinement):
    • ^で継承したフィールドをより厳密化する
    • 既定値の変更は可能だが、固定値は変更できない
  • 減算(subtraction):
    • -でフィールドを明示的に除外する
  • 選択型(Choice/Union):
    • 構造的に区別可能であれば型タグを不要とする
  • フィールドグループ:
    • どちらか一方必須という条件をタグなしで表現する
  • テンプレート:
    • 型パラメータ、値パラメータを持つ汎用定義

■ 4. データフォーマットとしての特徴

  • クオートなしの識別子:
    • Unicode対応であり、多言語を扱える
  • カンマの扱い:
    • カンマは空白扱いとなり、区切りとして任意である
  • 数値リテラル:
    • 任意精度の数値を扱え、16進数、2進数リテラルを直接書ける
  • 複数行文字列:
    • トリプルクオートで記述する
  • マップとレコードの区別:
    • JSONはキーを強制的に文字列化するが、TSONは任意の値をキーにできる
  • _(absent)センチネル:
    • 値がないという状態とnullを区別する
  • アノテーション(@):
    • 値にメタデータを付与でき、コメント構文の代わりになる
  • 型注釈:
    • !date!uuidなどにより、スキーマなしでも値の型を明示できる

■ 5. 互換性と現状

  • 厳密な上位互換設計:
    • すべての正当なJSONドキュメントは、そのままTSONとしても有効
  • 仕様の成熟度:
    • 現時点ではワーキングドラフト段階であり、まだ仕様変更の可能性がある
    • Java実装が既に動作している
  • 将来のエンコーディング計画:
    • JSON、コンパクト形式(TOON)、バイナリなど複数のエンコーディングのサポートを計画

■ 6. TSONの位置づけ

  • ASN.1に通じる思想:
    • スキーマこそが本体で、フォーマットはそれを運ぶ器という思想を持つ
  • 組み合わせによる新しい試み:
    • JSONの読み書きやすさとProtobuf的な厳格な型検証を組み合わせる
    • さらにハッシュによる改ざん検知、バージョン管理と結び付ける