今更ながら、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の仕様でシングルクォートではなく、ダブルクォート記述になってますね。
0 件のコメント:
コメントを投稿