JSONデータ確認用ユーティリティ (xyttr Advent Calendar 15日目)
この記事はxyttr Advent Calendar 2011の記事です。
Twitter API関数等で得られるJSONデータを見やすい形で出力するためのユーティリティーです。
(in-package :xyttr) (defun format-json (json str) (labels ((rec (data indent) (cond ((consp data) (format str "{~%") (dolist (kv data) (format str " ~V@T~A: " (* indent 4) (car kv)) (if (consp (cdr kv)) (rec (cdr kv) (1+ indent)) (format str "~S~%" (cdr kv)))) (format str "~V@T}~%" (* indent 4))) (t (format str "~V@T~S~%") (* indent 4) data)))) (rec json 0)))
1つ目の引数はjson:json-decodeで得られる連想リストで、2つ目の引数は出力先ストリームです。
ストリームにnilを渡すと文字列になりそうな雰囲気ですがなりません。(手抜き)
出力を文字列にしたい場合はwith-output-to-string等と併用してください。
*scratch*バッファでの実行例
(xyttr::format-json (xyttr:api-show-status :id 147162365903900673) t) { geo: nil truncated: nil id_str: "147162365903900673" retweet_count: 0 favorited: nil in_reply_to_screen_name: nil in_reply_to_user_id: nil in_reply_to_status_id_str: nil user: { profile_use_background_image: t protected: nil is_translator: nil follow_request_sent: nil following: t geo_enabled: nil profile_text_color: "333333" name: "ネコと和解せよ" id_str: "424679891" statuses_count: 258 (以下40行ほど略)
S式じゃないと見にくい、って人は{}を()に変えて、7行目の~Aとコロンの位置を入れ替えるとplistっぽくなって良いと思います。
また、下記のようなコマンドを作っておくと、タイムラインバッファ上のツイートデータの中身をサクっと確認できて便利です。
(defmacro w/popupbuf ((name &optional read-only) &body body) (w/uniq (km wc closer) `(let ((,km (make-sparse-keymap)) (,wc (current-window-configuration))) (labels ((,closer () (interactive) (delete-buffer ,name) (set-window-configuration ,wc))) (define-key ,km #\q #',closer)) (with-output-to-temp-buffer (,name t) ,@body) (setq buffer-read-only ,read-only) (use-keymap ,km)))) (setf (get 'w/popupbuf 'ed::lisp-indent-hook) 1) (defun show-jsondata () (interactive) (multiple-value-bind (s json) (entry-point) (w/popupbuf ("*tw:jsondata*") (format-json json t)))) (define-key *xyttr-timeline-keymap* #\T 'show-jsondata)
タイムラインバッファ上でTを押すとツイートデータをポップアップバッファに表示します。ポップアップバッファはqを押すと閉じます。
なおこのコマンドのコードはconfig.lサンプルフォルダにwindow.l、dump.lというファイル名で収録されていますので、参考にしてみてください。