[Javascript] JSON.parseで'(シングルクォート)を使うとエラーになる件

2017年6月6日

Javascript テクノロジー プログラミング

今更ながら、JavascriptのJSONエンコードをする時にエラーに悩まされていて、数時間無駄にしたので、ブログに愚痴がてら、メモメモ。 とりあえず、現象と原因は、表題の通りなのだが、文字列を囲むのは"(ダブルクォート)と'(シングルクォート)のどちらでもいいというのが、大体のプログラム言語での共通認識だと思っていたのが、ハマった原因。 JSON.parseでJSONフォーマット文字列をエンコードしようとした場合、jsonのkey,valueを囲む記号で'(シングルクォート)を使うと、メチャクチャErrorが出るので要注意という事。

調査

とりあえずググってみると、わんさかハマった人がいました。 JSON.parse シングルクォート | Google

実験

Double-Quotation

まずは、一番のノーマル型であるダブルクォートのみ var txt = '{"sun" : "Sunday" , "mon" : "Monday" , "tue" : "Tuesday" , "wed" : "Wednesday" , "thu" : "Thursday" , "fry" : "Fryday" , "sat" : "Saturday"}'; var json = JSON.parse(txt) json.sun > "Sunday" 問題なく成功

Double-Quotation & Escape

上記が文字列をシングルクォートで囲っているので全てダブルクォートのバージョン var txt = "{\"sun\" : \"Sunday\" , \"mon\" : \"Monday\" , \"tue\" : \"Tuesday\" , \"wed\" : \"Wednesday\" , \"thu\" : \"Thursday\" , \"fry\" : \"Fryday\" , \"sat\" : \"Saturday\"}"; var json = JSON.parse(txt) json.sun > "Sunday" これも問題なし。

Single-Quotation

さて、問題のシングルクォートです。 var txt = "{'sun' : 'Sunday' , 'mon' : 'Monday' , 'tue' : 'Tuesday' , 'wed' : 'Wednesday' , 'thu' : 'Thursday' , 'fry' : 'Fryday' , 'sat' : 'Saturday'}"; var json = JSON.parse(txt) > Uncaught SyntaxError: Unexpected token ' in JSON at position 1 文字列の定義段階では、エラーは出ていないけど、JSON.parse段階で'箇所でエラーです。 ちなみに、ダブルクォートと同じように、全てシングルクォートにしてエスケープ処理をしたバージョンです。 var txt = '{\'sun\' : \'Sunday\'}'; var json = JSON.parse(txt) > Uncaught SyntaxError: Unexpected token ' in JSON at position 1 at JSON.parse (<anonymous>) at <anonymous>:1:17 全く同じエラーです。

Value inner '(Single-Quotation)

最後は、文字列内にシングルクォートを使う場合 var txt = '{"man" : "I am man" , "woman" : "I\'m woman"}'; var json = JSON.parse(txt) json.man > "I am man" これは成功という事は、囲み記号でのシングルクォートが使用禁止です。

他のメソッドではどう?

Javascriptでプログラムする機会は多いので、他のメソッドでも試して置くことにしました。

console.log

var txt = "{'sun' : 'Sunday' , 'mon' : 'Monday' , 'tue' : 'Tuesday' , 'wed' : 'Wednesday' , 'thu' : 'Thursday' , 'fry' : 'Fryday' , 'sat' : 'Saturday'}"; console.log(txt); > {'sun' : 'Sunday' , 'mon' : 'Monday' , 'tue' : 'Tuesday' , 'wed' : 'Wednesday' , 'thu' : 'Thursday' , 'fry' : 'Fryday' , 'sat' : 'Saturday'} コンソールは問題なさそうです。

alert

var txt = "{'sun' : 'Sunday' , 'mon' : 'Monday' , 'tue' : 'Tuesday' , 'wed' : 'Wednesday' , 'thu' : 'Thursday' , 'fry' : 'Fryday' , 'sat' : 'Saturday'}"; alert(txt); キャプチャしておきましたが、問題ないようです。

これからどうする?

とりあえず、ダブルクォートを基準にしておけば、問題なさそうです。 ただし、これはjavascriptのネイティブ記述での仕様なので、他の言語であれば、別のルールがあるかもしれません。 エラーを出してちゃんとテストを行ってリリースすれば、問題はなさそうですが、できれば知識として身につけておきたいルールですね。 そもそも、JSONの仕様でシングルクォートではなく、ダブルクォート記述になってますね。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。