[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[kahua-dev:01247] Kahua で JSON
こんばんは柴田です
KahuaとJavaScriptとのデータ受け渡しが面倒だったので,試験的に
JSONインタープリタを追加しました.
JSON(JavaScript Object Notation)は,軽量のデータ交換フォーマットで
JavaScriptのサブセットだそうです.
http://www.crockford.com/JSON/index.html
ノードのトップに"json"タグを付ければ JSONインタープリタによって
JSONコードが出力されます.
S式での形式は
http://www.call-with-current-continuation.org/eggs/json.html
を真似ました.
例えば
'((json
(1
"s"
("l" "i" "s" "t")
#((a . "v")
(b . "n")))))
で
([1,"s",["l","i","s","t"],{a: "v",b: "n"}])
が出力されます.
これだけだと淋しいので,x->jsonメソッド と <json-base>クラス を追加してあります.
特定化したx->jsonメソッドを定義すれば,任意のオブジェクトをJSON化できます.
また,<json-base>クラスを継承すれば,":json"スロットオプションが使えるようになります.
(define-class <status> (<kahua-persistent-base> <json-base>)
((code :allocation :persistent :init-keyword :code
:json #t)
(color :allocation :persistent :init-keyword :color
:json #t)
))
↑こんな感じでクラスを定義しておけば
(make <status> :code "open" :color "red")
(make <status> :code "on-hold" :color "white")
(make <status> :code "close" :color "gray")
`(json ,(make-kahua-collection <status>))
で
([{code: "open",color: "red"},{code: "on-hold",color: "white"},{code: "close",color: "gray"}])
がブラウザに送られます.
JavaScript側では
function show_status(){
function handler(req)
{
function taiou(status) {
return div$([dt$(status.code),
dd$(status.color)]);
}
var result = eval(req.responseText);
document.body.appendChild(dl$(result.map(taiou)));
}
new Ajax.Request('/json-test/json-status', {onComplete: handler});
}
という感じで,statusをそのままobjectとして扱えます.
で,最終的には
<DL>
<DIV>
<DT>open</DT>
<DD>red</DD>
</DIV>
<DIV>
<DT>on-hold</DT>
<DD>white</DD>
</DIV>
<DIV>
<DT>close</DT>
<DD>gray</DD>
</DIV>
</DL>
になります.
interp-*でkahua.serverモジュールが肥大化しちゃいそうなので
interp部分だけでも分離できると良いですね.