JSON
仕様など
/rtfm/JSON
JSON 出力で何が難しいか?
カンマによる継続
エスケープ処理
カンマによる継続
綺麗に整形しようと考えると、人の目で見たときにはカンマは行末にあるべきだと考えられる。
次にデータが現れるかどうかを知らなければ、カンマを付けていいかどうかは分からない。
簡単に処理したい場合(整形が不要な場合)、「頭にカンマを付ける」「ただし、初回だけカンマを出力しない」という実装にする。
初回を気にしなくていい場合は、「常に頭にカンマを付ける」と簡易化することができる。
エスケープ処理
単純に文字列をそのまま出力すると、崩れてしまうことがある。
ダブルクォーテーション
制御コード(改行など)
JSON で定義されているエスケープは以下しかない。(似て非なるエスケープ処理がよくあるが混同すると壊れる。)
table:JSON_escape
U+0022 " \"
U+005C \ \\
U+002F / \/
U+0009 TAB \t
U+000D CR \r
U+000A LF \n
U+000C FF \f
U+0008 BS \b
任意の文字 \uXXXX (16進数4桁大文字小文字区別なし)
\UXXXXXX が存在しない。
つまり、UTF-16としてサロゲートペアを考慮して書くしかない。
JSON でスラッシュがエスケープ対象である理由(仕様上は特に明示されていない)
JSON は / はそのまま受け取るので JSON そのものの制約ではない。
JSON が HTML 要素のコンテナ内で使われているときに、</script> などの / をエスケープする必要があるため。
code:sample.json
<script>
var jsonData = { "tag": "<\/script>" };
</script>
JavaScript で正規表現リテラルにスラッシュが使われているため。
URL、ディレクトリパスのエスケープのため。(別のテキスト処理で誤って処理されないようにするため)
https://stackoverflow.com/questions/1580647/json-why-are-forward-slashes-escaped
JSON の問題
JSON は読みやすいが、項目ごとにラベルが付くため、データが巨大化しやすい。
転送時に圧縮する方法がよく使われる。
不定長のため、ランダムアクセスが困難。大容量データには向かない。
常にデータの全読み出し、全書き込みが必要。
行単位にする場合は改行区切りのJSONが使われることがある。
コメントが付けられない。
キー名を工夫してコメントにする方法はよく知られている。
コメントを許容する実装がある。
書き間違えでエラーが起こる場合、何が悪いのか分からないことが多い。
プログラムで書き換える(読み書きする)と辞書(key-value)の部分の順序が不安定になっている。
コメントのつもりが泣き別れになる。
綺麗に並べたつもりがぐちゃぐちゃになる。
include, reference の概念がないため、全部を1ファイルに入れなければならない。
独自にリンクを持つ場合、その実装を知らなければリンクをたどれない。
関連
JSONの解析
JSONの組み立て