JSONを見たこともない人が対象だとしたら、こんななぞなぞは面白いんではないだろうか。
ただ見落としや間違いもきっとあるからコメント欄で修正アドバイスくれたりすると助かる。
前置き
理論上は以下の内容のみで完全にJSONの書式は説明されている。
「理論上は」ということはロジカルシンキングによって最悪でも実際のサンプルなしで完璧にJSONを記述する方法を知り得ることができると主張しているものとする。(ただし言葉の意味は先に説明されるとは限らない。)
説明
-
原則
- 特に注意がない場合、改行、空白は含んで良い。
- 3種類のオブジェクトしかない。
- 配列と辞書を用いれば、入れ子状にデータを格納できる。これによって繰り返し包括的に定義されたデータ構造を階層構造と呼ぶことにする。
- JSON全体としては、たった一つの辞書が宣言されたものである必要がある。(つまり最も短いJSONは{}である。)
-
オブジェクトについて
-
値
-
文字列
- 例: "Japanese", "json text"
- 文字列は必ず「"」で囲われる。
- 文字列中に「"」を含む場合、「\"」と記述する。
- 文字列中に「\」を含む場合、「\\」と記述する。
-
数値
- 例: 0, -5, 1.2345
- 0を含む整数値、または小数値
-
真偽値
- true, falseのみ
-
空
- nullのみ
これら値に改行を含んではならない。
-
-
配列:array
- オブジェクトのみを含み、0個以上で構成される。
- 辞書内に2個以上のオブジェクトが存在する場合、それらは「,」で区切られる。
- オブジェクトとして配列は{と}で囲われる。
- 辞書をオブジェクトとして複数個含む場合、それらが含む階層構造やKeyは同じであるのが望ましい。
-
辞書:hash
- KeyとValueのペアのみを含み、0個以上で構成される。
- Keyは必ず文字列でありValueはオブジェクトのいずれかである。(文字列は値としての文字列に準ずる。)
- KeyとValueは「:」で区切られ、"key-name":"value-string"という形式で表される。
- 辞書内に2個以上のペアが存在する場合、それらは「,」で区切られる。
- オブジェクトとして辞書は[と]で囲われる。
-
問題
上記の構造化された説明文をJSON形式で記述せよ。答えは正しい解釈と工夫が感じられれば、回答と一字一句同じである必要はない。
回答例
{
"説明": [
"特に注意がない場合、改行、空白は含んで良い。",
"3種類のオブジェクトしかない。",
"配列と辞書を用いれば、入れ子状にデータを格納できる。これによって繰り返し包括的に定義されたデータ構造を階層構造と呼ぶことにする。",
"JSON全体としては、たった一つの辞書が宣言されたものである必要がある。(つまり最も短いJSONは{}である。)"
],
"オブジェクトについて": {
"値": {
"文字列": {
"例": [
"Japanese",
"json text"
],
"説明": [
"文字列は必ず「\"」で囲われる。",
"- 文字列中に「\"」を含む場合、「\\\"」と記述する。",
"文字列中に「\\」を含む場合、「\\\\」と記述する。"
]
},
"数値": {
"例": [
0,
-5,
1.2345
],
"説明": [
"0を含む整数値、または小数値"
]
},
"真偽値": {
"例": [
true,
false
],
"説明": [
"true, falseのみ"
]
},
"空": {
"例": [
null
],
"説明": [
"nullのみ"
]
}
},
"辞書": [
"KeyとValueのペアのみを含み、0個以上で構成される。",
"Keyは必ず文字列でありValueはオブジェクトのいずれかである。(文字列は値としての文字列に準ずる。)",
"KeyとValueは「:」で区切られ、\"key-name\":\"value-string\"という形式で表される。",
"辞書内に2個以上のペアが存在する場合、それらは「,」で区切られる。",
"オブジェクトとして辞書は[と]で囲われる。"
],
"配列": [
"オブジェクトのみを含み、0個以上で構成される。",
"辞書内に2個以上のオブジェクトが存在する場合、それらは「,」で区切られる。",
"オブジェクトとして配列は{と}で囲われる。"
]
}
}