Slide
解説
それぞれの問題の解説を軽くしていきます。今回参考にしたのは以下の仕様です。json.org よりも以下のサイトの方が分かりやすかったのです。
https://www.crockford.com/mckeeman.html
1 問目
オブジェクト型の最後の値の後にはカンマが付かないという問題です。初めて JSON を触ったばかりの頃に一度はやったことがあるミスだと思います。 仕様書の抜粋は以下です。
object
'{' ws '}'
'{' members '}'
members
member
member ',' members
以上の定義より、最後にカンマがつかないことが分かると思います。仕様書で見ると普通ですが、実際に書くとむかつく定義だと思います。以下だったら最後にカンマいけたのに…
members
member ','
member ',' members
2 問目
オブジェクト型の各宣言の間に改行は入るか?という問題です。これは、空白の宣言に改行が入っていることを知っていれば簡単な問題です。
オブジェクトの member
定義は以下のようになっています。
member
ws string ws ':' element
element
ws value ws
ws
""
'0020' ws
'000A' ws
'000D' ws
'0009' ws
000A
が改行にあたるため、改行がいくあらあっても問題ないことがわかります。
3 問目
数字型がどのような表現が可能か?という問題でした。数字型に関する構文木はちょっと面倒です。
number
integer fraction exponent
integer
digit
onenine digits
'-' digit
'-' onenine digits
digits
digit
digit digits
digit
'0'
onenine
onenine
'1' . '9'
fraction
""
'.' digits
exponent
""
'E' sign digits
'e' sign digits
sign
""
'+'
'-'
一個ずつ見ていってもスライドの解説以上の情報は得られないので、対応する構文木の形を下に用意しました。こんな形に処理されているよというものです。
number
integer(digit(0))) fraction(. digit(0)) exponent(E sign(-) digits(digit(0) digits(digit(0))))
わかりづら…
4 問目
エスケープシーケンスの問題に見せかけた数字の問題です。先程の数字の定義をよく見ると 0 を 2 つで零値として書くことができないため、これは不可となります。 エスケープはここで出てきたものプラスユニコード宣言がエスケープ対象として定義されています。
escape
'"'
'\'
'/'
'b'
'f'
'n'
'r'
't'
'u' hex hex hex hex
見なれているものが多く、直感的にも分かりやすいものが定義されている印象です。
5 問目
絵文字が可能かとう問題。問題でも触れていますが、文字の範囲は明確に定義されています。
character
'0020' . '10FFFF' - '"' - '\'
'\' escape
上で分かるように改行(000A)は含まれていないので、文字列に改行は含めることができないのが、分かりやすいと思います。 unicode に存在しない文字は以下リンクに書いてあるので、興味があったら見てみるといいかもしれないです。
6 問目
先程あった、'u' hex hex hex hex
この定義の問題です。実際問題であったような \u12345
が表現できないのは微妙に困りそうと思いますが、どうなんでしょう 🤔
終わりに
最後の方は適当になりましたが、無事解説しました。もっと問題作ろうとしましたが、json の構文は簡単で 6 問が限界でした。このスライドを見た人が json の勉強になったと感じてくれたらいいなぁ、というのが僕の願いです。