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 に存在しない文字は以下リンクに書いてあるので、興味があったら見てみるといいかもしれないです。

unicode に存在しない文字

6 問目

先程あった、'u' hex hex hex hex この定義の問題です。実際問題であったような \u12345 が表現できないのは微妙に困りそうと思いますが、どうなんでしょう 🤔

終わりに

最後の方は適当になりましたが、無事解説しました。もっと問題作ろうとしましたが、json の構文は簡単で 6 問が限界でした。このスライドを見た人が json の勉強になったと感じてくれたらいいなぁ、というのが僕の願いです。