as3corelibのJSONと改行コード
as3corelibのJSONクラスを使うと、ActionScript 3.0からJSONを手軽に扱えます。
…と、得意げに言ってみましたが、実はハマりました><
タイトルにもある通り、URLLoader#load等で得た文字列をJSON.decodeする時、改行コードがLFでないとパースエラーに見舞われます。
現在(as3corelib-.92以降)はCRでもLFでもCRLFでも大丈夫です。
id:FLIP_FLOPさんにコメントを頂き、再検証しました。
なので、以下はcorelib-.90以前のバージョンにのみ該当します。
[/追記][Fault] exception, information=Error: Unexpected encountered Fault, parseError() at JSONTokenizer.as:546
JSONLintもスンナリ通るし、おっかしーなーと思いつつ、ためしに空白文字・改行文字を削ってみると、
スペースなし → NG
タブなし → NG
改行なし → OK
という結果。
もしや…と.jsonファイルの改行コードをCRLFからLFに変えたところ、OKでした。
手書きのJSONはあまり扱わないかもしれませんが、ちょっとテストしてみたい時などには不便ですね。
それに、様々なWeb APIがJSONを吐き出す昨今、コード中にCRLFが含まれないとも限りません。
そこで、取得した文字列を置換することで対応しました。
ちなみに、自分が読んだ限りでは、JSONの仕様には改行コードに関することは明記されていませんでした(文字列リテラル内のエスケープ以外)。
いつものようにコード例を添えて覚書
まずは.json。
// something.json { "propA" : [0, 1], "propB": [ [2, 3, 4], [5, 6, 7], [8, 9, 10] ] }
そして、.as。
// Main.as package { import com.adobe.serialization.json.JSON; import flash.display.Sprite; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; public class Main extends Sprite { private var jsonURL:String = 'json/something.json'; private var obj:Object = {}; public function Main():void { var urlRequest:URLRequest = new URLRequest(jsonURL); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, completeHandler); urlLoader.load(urlRequest); } private function completeHandler(event:Event):void { event.target.removeEventListener(event.type, arguments.callee); var urlLoader:URLLoader = event.target as URLLoader; var jsonString:String = (urlLoader.data as String).replace(/\r\n|\r/g, '\n'); obj = JSON.decode(jsonString); trace(obj.propB[1]); } } }
一連の流れが見えるように、まるまる書いてみました。
ポイントは、completeHandler内のvar jsonStringの行です。
これで、.jsonの改行コードはCR、LF、CRLFのどれでもOKになります。
取り込んだ後でテキストとして扱う必要がないのなら、別に\nにしなくても空文字列でよいですね><
参考サイト
- JSON
- JSONの仕様。非常に短く簡潔です。ページの先頭で言語を選べます(日本語もある)。
- JSONLint - The JSON Validator
- そのまんま、JSONの構文チェッカーです。
- もう一度、ちゃんとJSON入門 - 檜山正幸のキマイラ飼育記 (はてなBlog)
- JSON仕様の、見落としがちな部分+αが丁寧にまとめられた記事です。
初めてJSONを出力する側に立った方は必読! - Google Code Archive - Long-term storage for Google Code Project Hosting.
- as3corelibのプロジェクトページです。JSON周り以外にも、ユーティリティクラスが満載!