書いて覚えるSwift入門

第40回 新しいフォーマット「SION」の紹介

この記事を読むのに必要な時間:およそ 4 分

このようにシリアライゼーションフォーマットはいくつもありますが,現在圧倒的に用いられているのはJSONで間違いないでしょうリスト3)⁠

リスト3 JSONの例

  "array" : [
    null,
    true,
    1,
    1.0,
    "one",
    [1],
    {"one" : 1.0}
  ],
  "bool" : true,
  "date" : 0.0,
  "dictionary" : {
    "array" : [],
    "bool" : false,
    "double" : 0.0,
    "int" : 0,
    "nil" : null,
    "object" : {},
    "string" : ""
  },
  "double" : 42.195,
  "int" : -42,
  "nil" : null,
  "string" : "漢字,カタカナ,ひらがなの入った\"string\"😇",
  "url" : "https://github.com/dankogai/"
}

ECMAScriptのリテラル,つまりプログラマが書きおろすフォーマットがもとになっていることもあって,インデントと改行を入れれば人が読み書きするのも容易で,空白文字を取ればXMLよりもコンパクト。データ交換にも可視化にも向いたJSONは,今やECMAScriptだけではなくほとんどの言語で標準サポートしています。

しかし時代が経つにつれ,次のようにJSONに対する不満も溜まってきました。

  • コメント(comment)が使えない。設定ファイルとして使う場合,これはかなり不便注1
  • 辞書(dictionary)⁠ECMAScriptでいうところのobjectのキーとして文字列(string)しか使えない注2
  • DateDataがサポートされていない

MessagePackはバイナリフォーマットに特化することでJSONの不満をかなり解消しました。数値型はずっとコンパクトで,辞書のキーにはMessagePack自体でシリアライズできるデータはなんでも使える。しかしバイナリフォーマットだけあって人が直接読み書きするのは無理ゲー……。

――というわけで筆者は「テキスト版のMessagePack」を探していたのですが,ある日気づいてしまったのです。⁠それってSwiftのリテラルでよくね?」と。

そうしてSIONが爆誕しました。

ご覧のとおり表1リスト4)⁠

  • 辞書は{}ではなく[]で括る。空の辞書は[:]とすることで配列[]と区別しているのはSwiftと同様
  • コメント可能。//から改行までがコメント
  • DataDateも扱える
  • 数値はIntDoubleを別のものとして扱う
    • DoubleNaN±Infinityも受け付ける
    • → 16進表記も受け付ける。これにより精度劣化が防げる
  • SIONで扱える型ならすべて辞書のキーとして使える

表1 SIONと他言語の比較

TypeSIONMsgPackJSONProperty
List
Comment
Nilplist: .binary only
Bool
Int64bit
DoubleJSON's Number
Stringutf-8 encoded
Databinary blob
Date .timeIntervalSince1970 in Double
[Self]aka Array
[String:Self]aka Object, Map…
[Self:Self]non-String keys

リスト4 SIONの例

[
    "array" : [
        nil,
        true,
        1, // Int in decimal
        1.0, // Double in decimal
        "one",
        [1],
        ["one" : 1.0]
    ],
    "bool" : true,
    "data" : .Data("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"),
    "date" : .Date(0x0p+0),
    "dictionary" : [
        "array" : [],
        "bool" : false,
        "double" : 0x0p+0,
        "int" : 0,
        "nil" : nil,
        "object" : [:],
        "string" : ""
    ],
    "double" : 0x1.518f5c28f5c29p+5, // Double in hexadecimal
    "int" : -0x2a, // Int in hexadecimal
    "nil" : nil,
    "string" : "漢字,カタカナ,ひらがなの入ったstring😇,"
    "url" : "https://github.com/dankogai/",
    nil   : "Unlike JSON and Property Lists,",
    true  : "Yes, SION",
    1     : "does accept",
    1.0   : "non-String keys.",
    []    : "like",
    [:]   : "Map of ECMAScript."
]

JSONがJavaScript Object Notationなら,SIONはSwift Interchangeable Object Notation。読み方は「紫苑(シオン)⁠でも「西園(サイオン)⁠でも⁠es-eye-oh-en⁠でもどれでもいいのですが,日本だと「紫苑」が多そうです。

幸いにして業界の評判は上々で表1のコメント欄参照)⁠最初のリファレンス実装であるswift-sionをGitHubに上げて,Qiitaで紹介したら,MessagePackの中の人も好意的に評価してくださいましたし,本誌でもおなじみのVimmerでGopherなmattnがgo-sionを公開してくれました。それも筆者がECMA Scriptの実装,js-sionをあげる前に!

注1)
npmのpackage.jsonでコメントを含めてしまってがっ!――とやらかしてしまった経験をしたのは筆者だけではないでしょう。
注2)
HashableであればなんでもOKのSwiftだとJSON化できないDictionaryがかなりある。

次回予告

というわけで,次回はこのSIONの実装であるswift-sionを題材にSwiftyなデータ処理とは何かを考察していきます。

Software Design

本誌最新号をチェック!
Software Design 2019年10月号

2019年9月18日発売
B5判/176ページ
定価(本体1,220円+税)

  • 第1特集
    ⁠速い⁠Webアプリケーションの作り方[フロントエンド編]
    レンダリングのしくみからHTML/CSS/JavaScriptの書き方まで
  • 第2特集
    わかりやすい絵文字の講座
    絵文字をきっかけに振り返る文字コードの歴史
  • 特別企画
    快適な朝を創りあげる
    Ejectコマンド工作――職人の朝を支える技術の巻

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。