読者です 読者をやめる 読者になる 読者になる

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というファイル名で収録されていますので、参考にしてみてください。