JSONパーサーがUNICODE文字列をデコードしてくれない
Rubyだと、
> str='{"message":"\u30ed\u30b0\u30a4\u30f3\u3057\u307e\u3057\u305f","status":"succeed"}' => "{"message":"\\u30ed\\u30b0\\u30a4\\u30f3\\u3057\\u307e\\u3057\\u305f","status":"succeed"}" > JSON.parse(str) => {"message"=>"ログインしました", "status"=>"succeed"}
このようにparseすると、unicode記法の文字列を
ちゃんと日本語に変換してくれるんだけど、
Flash Builderでas3corelibのJSON parserをつかってやってみると、
<?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="385" height="108"> <fx:Script> <![CDATA[ import com.adobe.serialization.json.JSON; protected function button1_clickHandler(event:MouseEvent):void { var str:String='{"message":"\u30ed\u30b0\u30a4\u30f3\u3057\u307e\u3057\u305f","status":"succeed"}'; var json:Object=JSON.decode(str); label.text=json.message; } ]]> </fx:Script> <fx:Declarations> <!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 --> </fx:Declarations> <s:Button x="10" y="10" label="変換" click="button1_clickHandler(event)"/> <s:Label x="10" y="39" fontSize="12" id="label"/> </s:WindowedApplication>
これを実行してみると、
となり、全然日本語になってない。
どうも文字の構造だけをJSONに変換するだけのようです。
みなさんどうしているのでしょう?
XMLにしたほうがいいのかのう。。。
XMLパーサーだと日本語をデコードしてくれる
上のJSONパーサーだと日本語を作ってくれないのですが、
XMLだとどうかと思って実験してみました。
<?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="385" height="108"> <fx:Script> <![CDATA[ import com.adobe.serialization.json.JSON; protected function button1_clickHandler(event:MouseEvent):void { var str:String='<?xml version="1.0" encoding="UTF-8"?><hash><status>succeed</status><message>ログインしました</message></hash>'; var xml:XML=new XML(str); trace(xml.message); label.text=xml.message; } ]]> </fx:Script> <fx:Declarations> <!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 --> </fx:Declarations> <s:Button x="10" y="10" label="変換" click="button1_clickHandler(event)"/> <s:Label x="10" y="39" fontSize="12" id="label"/> </s:WindowedApplication>
JSON JSONしているのはRuby on Rails関係だけで、
世の中的にはまだまだ普通はXMLだろ。って
ことなのかもしれません。
個人的にはJSONでいきたいんだけどな。
読みやすいし。短いし。
JSONパーサが悪いんだろうけど、どこが悪いのかわからなくなってきた
テストした文字列に問題があったみたいで、
'{"message":"\u30ed\u30b0\u30a4\u30f3\u3057\u307e\u3057\u305f","status":"succeed"}'
この\をちゃんとバックスラッシュにしたらうまくいった。
けど、結局何が悪いのかわかってない。
元の文字列が問題ではないというのは
なんとなくわかっているんだけど。
まさかとは思ったが、URLLoaderの仕様だったらしく、Responseの中身を書き換えていた
HTTPのリクエストを出して、その時に
{"message":"\u30ed\u30b0\u30a4\u30f3\u3057\u307e\u3057\u305f","status":"succeed"}
を出していたとすると、URLLoaderが
\(バックスラッシュ)を勝手に
[34]から[194,165]のコードに書き換えてしまうらしいです。
ちょっと表現があやしいので、コードを見ていただくと、
urlLoader.addEventListener(Event.COMPLETE,function(event:Event):void{ var body:String=(event.target as URLLoader).data; var resultArray:Array=JSON.decode(body).parts; partList.source=new Array(); for each(var item:Object in resultArray){ partList.source.push(item.part.name); } });
こんなActionListenerでJSONを読んでいるのですが、
URLLoaderから.dataをしているタイミングなのかどこなのか
わからないのですが、\が原型から2バイトコードに
変わっています。ですので、
urlLoader.addEventListener(Event.COMPLETE,function(event:Event):void{ var body:String=(event.target as URLLoader).data; var body2:String=body.replace(new RegExp(/\/g),"\\"); var resultArray:Array=JSON.decode(body2).parts; partList.source=new Array(); for each(var item:Object in resultArray){ partList.source.push(item.part.name); } });
こんな酷いコードを書くと、日本語に変換されました。
デバッグに時間がかかりましたね。
それで、原因はおそらくURLLoaderで
dataFormatをTEXTにしていると変換されるんでしょうね。
よけいな事をしれくれるものです。
BINARYにして、再挑戦してみます。