JSYNC←→YAML間のデータ相互変換仕様は漏れ・矛盾ない? #JSYNC

JSYNC は、YAML で実現可能な全てのデータモデルを、JSON の構文で表現するのが目的。
今、Ingy が仕様書を書いている段階なので、YAML~JSYNC 間のデータ相互変更について、
Shibuya.pm の中の人とか、検討漏れや矛盾に気づいた人がいたら、ぜひ教えて欲しいとのこと。
メールか、Twitter のハッシュタグは、#JSYNC でお願いします。(日本語もOK)
「この YAML を JSYNC で書くとどうなるの?」の質問も歓迎しています。

なお、http://jsync.org/ 上のサンプルコードのほかは、動く実装はまだ存在しません。
また、YAML は同じデータ内容を複数の書式で記述できるので、YAML→JSYNC→YAML と
往復変換したときに、再び一字一句全く同じ YAML 出力に戻っている必要はないです。

配列自体の型宣言


例えば、JSYNC のトリックの1つが、配列の第1要素で配列自体の型を宣言できること。
配列自体が特定のクラス(型)でなくて、ただの配列なら、宣言は省略できます。
JSYNC が特殊な JSON となる点なので、注意が必要。

# JSYNC
['2010-05-04']

# YAML
---
- '2010-05-04'

# Perl(参考)
['2010-05-04']

配列の第1要素がタグなしの、普通の値なら、その値が配列の最初の要素となる。
配列自体は、型宣言されない、ただの配列。

# JSYNC
['!timestamp 2010-05-04']

# YAML
---
- !timestamp 2010-05-04

# Perl(参考1)
[ bless( \'2010-05-04', 'Foo::TimeStamp' ) ]

# Perl(参考2)
[ DateTime->new(year=>2010, month=>4, day=>4) ]

配列の第1要素がタグ付きの値なら、その値が配列の最初の要素となる。
その値は型宣言されている。
配列自体は、型宣言されない、ただの配列。

# JSYNC
['!datelist', '2010-05-04']

# YAML
--- !datelist
- 2010-05-04

# Perl(参考)
bless( ['2010-05-04'], 'Bar::DateList' );

配列の第1要素がタグのみで、値なしなら、
その第1要素を配列自体の型宣言に利用する。
第2要素以降が繰り上がって、その配列の内容となる。

# JSYNC
['!datelist']

# YAML
--- !datelist []

# Perl
bless( [], 'Bar::DateList' );

配列自体が型宣言される点までは同じだが、第2要素以降がないので、bless された空配列になる。

エスケープの位置


文字列の先頭の記号を . でエスケープするだけでなかった。
「!type &address value」みたいに、複数の宣言が入る場合もある。
宣言の後で . が登場すると、それ以降が宣言でなくて文字列になる。

# JSYNC
[
['!type &address'],
['!type .&address'],
['.!type &address']
]

# YAML
---
- !type &address []
- [!type '&address']
- ['!type &address']

1番目は、空配列で、配列自体が type 型。(+アンカー登録)
2番目は、「&address」という type 型の値が入った配列。
3番目は、「!type &address」という文字列型の値が入った配列。

型宣言付の空文字列


値は空だけど、型宣言する場合の書き方。
. でエスケープして、エスケープ先の文字列長さが0になってる。

# JSYNC
'!type .'

# YAML
--- !type ''


ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 1

なるほど(納得、参考になった、ヘー)

この記事へのコメント

この記事へのトラックバック