ガジェット通信 GetNews

見たことのないものを見に行こう
  • 『パシフィック・リム:アップライジング』監督&ジョン・ボイエガに「ぼくのかんがえたさいきょうのかいじゅう」を見てもらった!
  • コムアイ(水曜日のカンパネラ)インタビュー「お風呂に入った猫がシュッと細くなってしまうところが情けなくて愛しい」
  • 仲良し全開のフラッシュ&サイボーグを直撃! 自分がバットマンだったらスカウトしたいキャラは?
  • 大泉洋『探偵はBARにいる』シリーズへの愛を語る「“好きなんだけど映画館には行かない”だと続かない」
  • 『ジュマンジ』でタフな美女戦士を熱演! カレン・ギランの好きなゲームは「メガドライブ『ソニック・ザ・ヘッジホッグ3』」
  • 俳優・中村倫也インタビュー「女子の周りから固める恋愛作成は逆効果な気がします(笑)」
  • 『ハン・ソロ/スター・ウォーズ・ストーリー』で大大活躍中! チューバッカさん直撃インタビュー:動画  
  • 『ミッション:インポッシブル/フォール・アウト』サイモン・ペッグインタビュー「ベンジーがイーサンに唯一勝てる場所」とは?
  • 北原里英が映画主演で後輩に見せる“道”「AKB48が夢の通過点では無くゴールになっているからこそ」
  • 『ゴースト・イン・ザ・シェル』のバトーさんを直撃! 原作愛がハンパなくて『イノセンス』制作を懇願するレベル
  • 『スーサイド・スクワッド』のダイバーシティを担う二人に直撃 「人間関係を構築するのに必要なこと教えよう」
  • 『レディ・プレイヤー1』キャストインタビューで判明!「実際にこの映画をテーマにしたゲームが発売予定だよ」
  • 北野武からの出演オファーに「役者やってて良かった」 『アウトレイジ 最終章』池内博之インタビュー
  • 『ブレードランナー 2049』“ジョイ”と“ラヴ”にインタビュー「SF映画は女子が観ちゃだめ? そんなわけないわ!」
  • 窪塚洋介が明かす未体験への挑戦と驚き 映画『沈黙-サイレンス-』でハリウッドデビューを飾る
  • 性別や年代によって楽しみ方が変わる映画『妻ふり』 榮倉奈々&安田顕インタビュー

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

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

【謎解きプログラム】エラーの起きる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の記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。