XSONはeXtensible and Simple Object Notationの略で、現状使われている多くのデータシリアライゼーションフォーマットや設定ファイルのフォーマットを改善して作られたそうです。
XSONには以下の2つの原則があるそうです。基本的にはシンプルな仕様にしつつもユーザーによる拡張を可能にしている点が特徴です。
- 非常にシンプルな基本仕様
- ユーザーがファイルごとに機能を追加できる
XSONのサンプルを以下に示します。仕様がシンプルであるために、雰囲気で読むことができます。
/* (This is a multi-line comment)
* List of servers in an XSON file
*/
servers: {
//Another comment.
alpha: [10.0.0.2, My Home Server]
bravo: [10.0.0.7, My Work Server]
charlie:[10.0.0.9, My Friend's Server]
aux: {
//Whitespace around (but not inside) the key or value is ignored
os : Ubuntu
version : 22.04 LTS
start time: 14:03:59:10 //The first colon is used to separate the key and value
}
}
記法仕様
キーバリュー
XSONのキーはコロン :
で区切られ、要素は改行で区切られます。
文字列にはクォートが不要で任意の数の空白を含むこともできます。
key: value
my key: my value
1行の中に複数個のコロンがあった場合は一番左のコロンが区切り文字になります。
my : character: 0x3A
この例ではキーは my
でバリューは character: 0x3A
です。
キーは位置位である必要があり、大文字と小文字は区別されません。
以下の例は同じキーと認識され、解析エラーが発生します。
key1: value 1
Key1: value 2
キーとバリューの前後の空白は無視されます。つまり、以下の5つは全て同等です。
my long key : my long value
my long key:my long value
my long key: my long value
my long key :my long value
my long key: my long value
型の解釈
XSONには型がありません。つまり、型情報は各言語のXSONパーサーによって与えられることになります。
例えば、以下のXSONがあった時に、
my magic number: 10
読み出し時にパーサーに対して型情報を指定して読み出しを行います。
get<string>("my magic number"); //returns '10' as a string variable
get<int>("my magic number"); //returns 10 as a signed integer
get<bool>("my magic number"); //returns 'true'
get<float>("my magic number"); //returns 10.f as a float
配列
角括弧とカンマを使って配列を定義できます。
末尾のカンマは許容されます。
my array: [
value one,
value two,
value three, //trailing comma is allowed
]
オブジェクト
XSONのオブジェクトは波括弧に囲まれたキーバリューのペアです。
my key: my string value
my object: {
property one: true
property two: false
property three: {
key: this is inside yet another object
}
property four: [
this is an array inside an object
]
}
コメント
XSONのコメントはC言語と同じような構文です。
//This is a single line comment
key: value //This is an in-line comment. This comment is not included in the value.
/********************************
* This is a multi line comment *
********************************/
/* This is another multi line comment.
Maybe it would describe the significance of 'key'
*/
key1: value /* You can place multi line comments on one line */
key2: value /* Or you could even make it span
multiple lines after some XSON text */