Web-serviceのインターフェースはXMLがよく用いられますが、近頃はJSONが増えてきたみたいです。JSONはXMLに比べフォーマットが単純で伝文がコンパクト、軽量インターフェースなのでスマホのような(デスクトップ機よりは)非力なクライアントでも楽に扱えますからね。そんなわけでC++でJSONを扱うべくリサーチを始めました。
JSONの構造
JSON:JavaScript Object Notation(JavaScriptオブジェクト記法)、RFC4627(PDF)で規定されています。英文とはいえ10ページにも満たない小さな規格ですからさほどの苦労もなく理解できます。
えーと、まずJSONで表現できるvalue(値)は:
- boolean(真偽値)
- number(数値)
- string(文字列)
の3つの基本型。booleanはtrueかfalse、numberは浮動小数点いわゆるdouble値(整数値はありません)、stringは文字通り「"」で囲まれた文字列です。
さらに構造をもったvalueとして:
- array(配列)
- object(オブジェクト)
があります。arrayは0個以上のvalueを内包する順序列、valueを「,」で区切り、「[」と「]」で囲みます。objectはキーと値の組を並べたもの、いわゆる連想配列あるいは辞書と呼ばれるアレです。キーはstring、値はvalueで、key:value を「,」で区切って並べ、「{」と「}」で囲みます。
そしてもう一つ、値を持たないこと(無効値)を表す:
- null
もvalueの一員です。
これらのvalueを文字列で表現したJSON textが伝文としてやりとりされるのですが、JSON textはarrayまたはobjectでなくてはなりません。さらに、JSON textはUnicodeでなくてはなりません(通常UTF-8が用いられます)。
RFC4627の末尾にあったJSON textの一例:example.jsonを以下に示します。読みやすいようにインデント/改行していますが、伝文として用いるときはメッセージ長をケチるためか、改行/空白をはしょってギチギチに詰められることが多いようです。
テキストとしても読みやすいですね。難点があるとすれば「コメントが書けない」ことでしょうか。メッセージのやりとりが目的の記法でありヒトサマが読むことは考えてないので仕方がないことではありますが。