AnyObject を JSON として出力する LLDB Plugin を作ったお話

Array または Dictionary のインスタンスJSON 形式で print する LLDB Plugin ほしい

と言われたので作ってみました。いざ作ってみるとこれがとても便利!!

github.com

README に install 方法が書いてあります。

注意点としては Swift モードの時の LLDB でしか意図した挙動はしません。 どうしても使いたい場合は、手元で Objective-C に書き直してもらえればと... LLDB Plugin の作り方は以前に記事を書いたので、そちらが参考になると思います。

dealforest.hatenablog.com

タイトルの通りインスタンスJSON に変換するということなので json コマンドにしました。 DataSource や API のレスポンスなど、特にデータ量が多いもの(でかい class や struct)を表示するときが幸せな気持ちになれます。

このような class, struct 定義があった場合

class User {
    var identifier = "dealforest"
    var loginCount = 10
    var height = 165.0
    var settings = [ "notification", "...", "..." ]
    var blog = Blog()
}

struct Blog {
    var title = "NANAIRO"
    var url = "http://dealforest.hatenablog.com/"
}

po で出力しようとすると class の場合アドレスしか表示されません。つらいですね。

(lldb) po User()
<User: 0x7faa5ad1b7b0>

(lldb) po Blog()
▿ Blog
  - title : "NANAIRO"
  - url : "http://dealforest.hatenablog.com/"

これが今回作った json コマンドの場合だとこうなります。

(lldb) json User()
{
  "height" : "165.0",
  "blog" : {
    "title" : "NANAIRO",
    "url" : "http:\/\/dealforest.hatenablog.com\/"
  },
  "identifier" : "dealforest",
  "settings" : [
    "notification",
    "...",
    "..."
  ],
  "loginCount" : "10"
}
/var/folders/63/jdd3tr3950s_0wvf5fk3_5xr0000gn/T/tmpyZbRpr.json

(lldb) json Blog()
{
  "title" : "NANAIRO",
  "url" : "http:\/\/dealforest.hatenablog.com\/"
}
/var/folders/63/jdd3tr3950s_0wvf5fk3_5xr0000gn/T/tmpQJRgo5.json

json コマンドを実行すると、JSON をファイルにも出力し、クリップボードにファイルの保存先のURLをコピーします。

なので jq を使えば簡単に JSON の結果をフィルタリングできます。 (jq は Homebrew を使って install できます)

$ cat /var/folders/63/jdd3tr3950s_0wvf5fk3_5xr0000gn/T/tmpyZbRpr.json | jq '.blog'
{
  "title": "NANAIRO",
  "url": "http://dealforest.hatenablog.com/"
}

class でも一応 p を使えば出力されはするのですが、データ量が多いときは出力される量も多くてつらかったのでなかなかに気に入っています。

ではでは。