[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部分だけでも分離できると良いですね.