なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこでJSONを扱ってみたら困った件

※これが書かれたのは なでしこvar1.579 の頃です。
バージョンアップで変わる可能性があります。

JSONとは
 javascriptで使っていた、配列(ハッシュ)を外部から取り込めるようにしたテキストファイル。
 便利なので他言語でも使うようになった。
 文字コードはUTF8Nで書くように決まっているらしい。

 こんな姿をしている(wikipediaより)

{"name": "John Smith", "age": 33}

 この文字列がJSON文字列。 ファイルに保存したものがJSONファイル(*.json)

JSONは何に使われているの?
 ブラウザゲームでかなり使われています。
 キャラのアニメーションや画像分割の座標が書かれていたり、
 キャラや装備のパラメータ情報が書かれていたり、
 シナリオのテキストが書いてあったりします。

なでしこのJSON関連の命令

なでしこには「JSONデコード」「JSONエンコード」命令があります。
なでしこの「JSONデコード」命令はJSON文字列をハッシュに変換できます。

//JSONデコードの使用例
結果とはハッシュ
結果=『{"name": "John Smith", "age": 33}』JSONデコード
結果「name」言う //→John Smith
結果「age」言う //→33

JSONエンコードはハッシュをJSON文字列に変換して返します。

なでしこのJSONエンコードJSONデコードが日本語に対応していない?

JSONエンコードはハッシュをJSONにする命令ですが、SJISのままです。
JSONエンコードで作ったjson文字列をJSONデコードすると……もとに戻りません!

jsonファイルはUTF8Nと決まっているからしかたないね……と思い、
JSONエンコード→UTF8N変換→JSONデコードとしても……もとに戻りません!

 挨拶とはハッシュ
 挨拶「日本語」=「こんにちは」
 json=挨拶JSONエンコード
 json表示 //→{"日本語":"こんにちは"}

 //エンコードしたものをデコード
 jsonJSONデコード
 それ表示 //→日本語=  値が戻らない
 
 //エンコードしたものをUTF8N変換してデコード
 jsonUTF8N変換
 それJSONデコード
 それ表示  //→譌・譛ャ隱・こんにちは  キーが戻らない(文字化け)

この件はなでしこのバグ&要望掲示板のこれが相当する……と思うのですが言葉が難しくて断定できません(投げ)

http://nadesi.com/cgi/bug/mbbs.php?m=log&logid=1960
他、jsonのハッシュのキーが非ASCIIの場合、デコードの際にutf8toAnsiを介さず返されるためにキーだけUTF8のままになっています。JSONの仕様上発生しえるのなら、あわせて対処が必要そうです。

JSONデコードに対応したJSONをつくるには?

日本語のキーと値を持つ場合、キーがSJISで、値をUTF8N変換したものをJSONデコードすると欲しかった結果が得られます。
なでしこの仕様変更でできなくなる可能性もあるので、おすすめはしません。

 //JSONデコードできるJSONのようなものを自力で作る場合
 sjis=SJIS変換(「日本語」) //キー
 utf8n=UTF8N変換(「こんにちは」) //値
 json = 「{波カッコ}"{sjis}":"{utf8n}"{波カッコ閉じ}」 //{"sjis":"utf8n"}
 h=jsonJSONデコード
 h表示 //→日本語=こんにちは

別の方法として、値の部分はUnicodeエスケープシーケンスというやつでも大丈夫みたいです。
Unicodeエスケープシーケンスは \u3053 のような書式で、この6文字で日本語1文字に相当します。

//UTF8NのかわりにUnicodeエスケープシーケンス
『{"日本語":"\u3053\u3093\u306b\u3061\u306f"}』JSONデコード
表示 //→日本語=こんにちは