体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

【謎解きプログラム】エラーの起きるJSONはどれ?【JSON】解答と解説

【謎解きプログラム】エラーの起きるJSONはどれ?【JSON】

本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。

「24時間以内に謎が解けない場合は、このPCのデータは消失する。

 謎は、あなたが真のプログラマーなら解けるものだ」

これは挑戦状ではなく脅迫状だ!

そこには、見たことのない謎が掲載されていた。

あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。

説明

画面に、3種類のJSON(JavaScript Object Notation)が示されます。

しかし、その内1つは、JavaScriptのオブジェクトにしようとすると、エラーの起きるJSONです。この、偽物のJSONを探し出して、指摘してください。

問題1

// 選択肢
{“a”: 1+11}
{“a”: 1111}
{“a”: true}

「JSON.parse(~)」と実行してみれば分かります。しかし、それでは流石に、説明として荒っぽすぎるので、仕様を確認してみましょう。

というわけで、「The JavaScript Object Notation (JSON) Data Interchange Format」(March 2014)を見てみます。

「3. Values」を見ると、値は、オブジェクト、配列、数値、文字列、あるいは false null true と書いてあります。

(他の参考ページ:「Standard ECMA-404」(October 2013)、「JSON」)

JSONは、JavaScript以外のプログラミング言語やそのライブラリでは、かなりアバウトに実装されています。そのため、問題では、JavaScriptベースで判定しています。JSONの名前自体が、「JavaScript Object Notation」ですし。

というわけで、以下、仕様を元に見ていきましょう。

選択肢1の「1+11」は、計算式なので、仕様の条件を満たしません。JSON内では、JavaScriptのように計算を行なうことはできません。

選択肢2の「1111」は、数値なので、仕様の条件を満たします。

選択肢3の「true」は、「true」なので、仕様の条件を満たします。

そのため、1番目の選択肢の「{“a”: 1+11}」が答えになります。

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード
var src = [‘{“a”: 1+11}’, ‘{“a”: 1111}’, ‘{“a”: true}’];
for (var i = 0; i

// 出力
1 SyntaxError: Unexpected token + in JSON at position 7
2 Object {a: 1111}
3 Object {a: true}

問題2

// 選択肢
{“a”: {“a”: {“a”: {}}}}
{“a”: function() {}}
{“a”: ““”}

以下、仕様を元に見ていきましょう。

選択肢1は、入れ子になっているだけで、最終的な値は「{}」でオブジェクトです。なので、値の条件を満たします。

選択肢2の「function() {}」は、関数なので、値の条件を満たしません。

選択肢3の「”“”」は、単なる文字列なので、値の条件を満たします。

そのため、2番目の選択肢の「{“a”: function() {}}」が答えになります。

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード
var src = [‘{“a”: {“a”: {“a”: {}}}}’, ‘{“a”: function() {}}’, ‘{“a”: ““”}’];
for (var i = 0; i

// 出力
1 Object {a: Object}
2 SyntaxError: Unexpected token u in JSON at position 7
2 Object {a: ““”}

問題3

// 選択肢
{“a”: undefined}
{“a”: [[[]]]}
{“a”: null}

以下、仕様を元に見ていきましょう。

選択肢1の「undefined」は、値の条件を満たしません。。

選択肢2の「[[[]]]」は、入れ子になっている配列です。最終的な値は「[]」で配列なので、値の条件を満たします。

選択肢3の「null」は、値の条件を満たしまます。

そのため、1番目の選択肢の「{“a”: undefined}」が答えになります。

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード
var src = [‘{“a”: undefined}’, ‘{“a”: [[[]]]}’, ‘{“a”: null}’];
for (var i = 0; i

// 出力
1 SyntaxError: Unexpected token u in JSON at position 6
2 Object {a: Array[1]}
3 Object {a: null}

CodeIQ運営事務局より

柳井さん、ありがとうございました!
柳井さんの次の問題にご期待ください。

CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。