※これが書かれたのは なでしこ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を表示 //→{"日本語":"こんにちは"}
//エンコードしたものをデコード
jsonをJSONデコード
それを表示 //→日本語= 値が戻らない
//エンコードしたものをUTF8N変換してデコード
jsonをUTF8N変換
それを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=jsonをJSONデコード
hを表示 //→日本語=こんにちは
別の方法として、値の部分はUnicodeエスケープシーケンスというやつでも大丈夫みたいです。
Unicodeエスケープシーケンスは \u3053 のような書式で、この6文字で日本語1文字に相当します。
//UTF8NのかわりにUnicodeエスケープシーケンス
『{"日本語":"\u3053\u3093\u306b\u3061\u306f"}』をJSONデコード
表示 //→日本語=こんにちは