ラベル JSON の投稿を表示しています。 すべての投稿を表示
ラベル JSON の投稿を表示しています。 すべての投稿を表示

2009年1月19日月曜日

JSONとCL (その3)

ああ、わかった。yasonのskip-whitespaceの問題ではない。

\\nなどがJSONの文字リテラルになるのは、JSONの文字列の中なのだ。だから

"\\n"

は、json:parseに対して\nというシンボルを与えているにすぎない(シンボルリテラルということ)。これがjson:parseにとってNewlineの意味になるのは、

"\"\\n\""

においてだ。なので、json:parseに与えられるストリームや文字列として改行コードをスキップしますよ、というのは、JSONの外として与えるべきであり、それは、

(json:parse (format nil "{ \"input_01\" : 123,~% \"input_02\" : \"hoge\" }"))

などであり、これは

;; => #<EQUAL hash-table with 2 entries @ #x10013ae732>

と正しくskip-whitespaceされてエラーにならない。

なお、ここで言っているJSONの意味とはCLオブジェクトによる意味論である。

こつこつ。

JSONとCL (その2)

yasonを使って、jsonを含むテキストチャンクからJSONらしき部分を抽出する処理を書いた。不細工な書きぶりだけどそこそこ動く。

;; 多値でparse結果を返す関数
(defun analyze (string &key (start 0))
(handler-case (values (with-input-from-string (s string :index index :start start)
(json:parse s))
index t)
(condition () (values nil (incf start) nil))))

;; それを使ってそれなりのチャンクを処理する関数
(defun analyze-chunk (chunk)
(let ((result)
(len (length chunk))
(start 0))
(loop
(multiple-value-bind (match new-start match-p)
(analyze chunk :start start)
(when match-p
(push match result))
(when (> new-start len)
(return (nreverse result)))
(setq start new-start)))))

(analyze-chunk "テストデータを作ってみました。\\n\\r{ \"input_01\" : 123, \"input_02\" : \"hoge\" }\\n\\rこんな感じでいいんでしたっけ?")
;; => (#<EQUAL hash-table with 2 entries @ #x10010b53a2>)
(analyze-chunk "abcd{\"hoge\" : 3} ほげほげ 3")
;; => (#<EQUAL hash-table with 1 entry @ #x10010ee552> 3)
(analyze-chunk "abcd{\"hoge\"\" : 3} ほげほげ 3 [3, 8 ,2")
;; => ("hoge" 3 3 3 8 2)
(analyze-chunk "abcd{\"hoge\"\" : 3} ほげほげ 3 [3, 8 ,2]")
;; => ("hoge" 3 3 (3 8 2))
(analyze-chunk "abcd{\"hoge\" : 3} ほげほげ 3 [3, 8 ,2]")
;; => (#<EQUAL hash-table with 1 entry @ #x100117aef2> 3 (3 8 2))

;; これはerrorになる。skip-whitespaceがおかしい?
(json:parse "{ \"input_01\" : 123,\\n\\r \"input_02\" : \"hoge\" }")

yasonのskip-whitespace関係のせいか、JSON構造の中に改行コードがあるとjson:parseがエラーになる。
これは次回探ってみる。

こつこつ。

2009年1月18日日曜日

JSONとCL

業務が大変忙しい。その合間をぬって、JSONとCLについて作業をすすめていた。とにかくこつこつ。


  • JSONのサンプルを作ろうとして、どうも作業しずらいなと感じた。何故かと考えると、REPLがないからだ。探してみると、SpiderMonkeyはREPLがあった。macportsにあるのでインストール。これは便利。
  • 続いて、これをcomintできるのかどうか。探すと、js-comintがあった。これも便利。
  • REPLでJSONのサンプルを試していると、どうも不可思議な振舞いがある。JSONをそもそものJavaScriptにて理解しようとすると、それなりに深くJavaScriptを理解しなければいけなさそう。それは嫌。
  • というわけで、yasonを使って、CLにてJSONの意味論を考えることにした。
  • CL上のテストデータとして、JSON文字列を作成し、これがどのようなCLオブジェクトに変換されるかにてJSONを理解する、ということ。これはうまくいった。

  • 続いて、JSONが文中に埋め込まれているようなテキストをパースできるように作業開始。例えば、

    テストデータを作ってみました。

    { "input_01" : 123,
    "input_02" : "hoge" }

    こんな感じでいいんでしたっけ?

    というテキストから、JSONデータな部分のみを特定してCLオブジェクトに変換するようなもの。
  • これにはyasonのsignalingのつくりの理解が必要。で、yasonのソースリーディング。
  • CLのcondision systemの復習が必要。
  • 実践CLの該当部分を先にやろう

地道にこつこつ。

2009年1月15日木曜日

JSON ???

JSONって変じゃないか?
"x"はJSONでのStringのリテラルなのだが、javascriptでevalしてみると。

js> eval( "x" );
eval( "x" );
typein:90: ReferenceError: x is not defined
js>

となって、シンボルxを参照する処理になる。"x"はシンボルのリテラルなのか?

JSONをちゃんと使えるようになるには、JavaScriptをちゃんと勉強しないといけないのか? それは避けたい、、、

2009年1月8日木曜日

JSON

CLでアプリを書くとしても、外部とのデータ入出力は常にS-expで、とは常にはいかない。代替的な手段として、Shibuya.lispのTTでは、JSONの採用が提案されていた。JSONを調べていくにあたっての情報源をまとめておく。調べる前の予見としては、JSONまたはYAMLがいいのではないかと思っている。あくまでS式がつかえない場合ですが。


こつこつ。