AnyObject を JSON として出力する LLDB Plugin を作ったお話
Array または Dictionary のインスタンスを JSON 形式で print する LLDB Plugin ほしい
と言われたので作ってみました。いざ作ってみるとこれがとても便利!!
README に install 方法が書いてあります。
注意点としては Swift モードの時の LLDB でしか意図した挙動はしません。 どうしても使いたい場合は、手元で Objective-C に書き直してもらえればと... LLDB Plugin の作り方は以前に記事を書いたので、そちらが参考になると思います。
タイトルの通りインスタンスを 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
を使えば出力されはするのですが、データ量が多いときは出力される量も多くてつらかったのでなかなかに気に入っています。
ではでは。