[CakePHP] JSON出力時にstring型をint型に戻す

久々のブログ、今回はCakePHPでJSON出力をするときにInteger型、String型に型変換して出力する方法について書きます。 (あ、今回も他力本願、満載)

まず、CakePHPでJSON出力をする為には

Controllerで

$yourJsonObect= $this->YourModel->find('all');
$this->set('yourJsonObect', $yourJsonObect);

としてやり

Viewで

<?php echo $javascript->object($yourJsonObect); ?>

としてやれば簡単に実現できます。

出力されるコードは以下のようになります。

[{"YourModel":{"id":"10060","foreign_id":"1","short_description":"Short Desc Test.","long_description":"Long Desc Test"},
{}
.....
)]

これで、殆ど場合は問題ないのですが、データベース上でIntegerで持っているスキーマ(id, foreign_idなど)も全てString型として出力されます。

もし、JSONデータを受け取る側が厳密にInteger型、String型を区別して受け取りたい場合などに以下の方法でスマートに解決できたので紹介します。

余談ですが、自分の場合は、iPhone開発において、JSONデータをウェブサーバーから受け取り、Core DataにInsertする時に、iPhone側で型チェックや型変換をさせたくなかったので、サーバー側で吸収してしまおうという経緯がありました。

参考にしたサイトはこちらです。

CakePHPのmodelの結果配列でstring型をint型に戻す。

CakePHPでmodel::findなどの関数で結果配列を取得したときに、データベースではint型の値string型として返って来ます。

今回は、flashにjson出力でデータを渡したかったので、別に文字列型のまま渡しても問題ないのかもしれないけど、なんか気持ち悪い。

それに例えばよくある、intの0,1をフラグと扱って if (flag) {.... }なんて書いたらマズいんじゃないかと思うので、settypeで型変換を行う方法。

引用元: CakePHPのmodelの結果配列でstring型をint型に戻す。: ろーにーの日記.

モデルの親クラスで、Findで取得したデータ(デフォルトは全てString)をデータベースのTypeを参照して、型変換を行っています。

app_model.phpにafterFind()オーバーライド関数を追加してやるだけ。

class AppModel extends Model{
	public function afterFind($results, $primary = false) {
		parent::afterFind($results, $primary);
		$columnTypes = $this->getColumnTypes();
		foreach($results as $index => $result) {
			foreach($columnTypes as $field => $columnType) {
				if($columnType == 'integer') {
					if(isset($results[$index][$this->name][$field])) {
						settype($results[$index][$this->name][$field], 'integer');
					}
				}
			}
		}
		return $results;
	}
}

これで全てのモデルが自動変換されるようになりました。 感激~

変換後のJSON出力を見ると以下のようになります。

[{"YourModel":{"id":10060,"foreign_id":1,"short_description":"Short Desc Test.","long_description":"Long Desc Test"},
{}
.....
)]

Integer型の数字の部分からダブルクォーテーションが消えました。

めでたしめでたし。

http://app.cocolog-nifty.com/t/trackback/120702/48427427

iPhoneでFlashのネイティブ対応が可能に

Appleの「iPhone」上で、Flashアプリケーションの対応を図れるようになると明らかにした。

引用元: アドビ、「Flash Professional CS5」を発表--iPhoneでFlashのネイティブ対応が可能に:アップルセンター - CNET Japan.

これでFlashプログラマーがiPhoneアプリの開発に参入できることになりますね。

Flashから常に敬遠していた自分は負け組みだぁ~(/_;)

今からでも勉強していこうかな・・・ でもうちはデザイン会社じゃないって理由でAdobeの高価なソフトは買ってもらえそうにないので、触るとしたらFlex SDKを使うんだろうけど、これ以上覚える言語を増やしていいのか?と頭の中で警告が鳴る。

それだったらやっぱりiPhoneの開発プラットフォームであるObjective-Cの方が断然興味あり。

あと、やっぱり気になるのがこれ。

Adobeの究極の目標は現在も変わっておらず、Flashを「Safari」ブラウザに統合してiPhoneで提供することが目指されている。同社最高 技術責任者(CTO)のKevin Lynch氏は、インタビューに応えて「ただ1つのウェブのみが存在するということこそ私の願いである」と述べた。

iPhone SafariのFlashプラグインはまだ先になりそうですが、近い将来に是非実現してほしいものです。