1. tenntenn

    Posted

    tenntenn
Changes in title
+[Go言語] JSONを解析するのに、型作るのはめんどい
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,55 @@
+
+ChromeのDevToolsには、timelineという機能があり、Webアプリのパフォーマンスチューニングに使えます。このtimelineで記録したデータはJSONで保存ができます。
+最初はjqを使って解析しようと思いましたが、スクリプトがだんだんと黒魔術臭がしてきました。
+
+そこで、Go言語で解析しようと思ったのですが、正直このJSONのフォーマットがイマイチ分からないので、型が作れません。また、Chromeさんはバージョンがガンガン上がるので、いつフォーマットが変わるか分かりません。その度に型が変わるのは嫌です。
+
+ということで、型を作らずにJSONを解析するライブラリ的なものを作ってみました。
+`reflect`パッケージ的な感じに使えます。
+
+* https://github.com/tenntenn/gj
+
+こんな感じで使えます。`ResourceSendRequest`レコードを羅列する例です。
+
+```
+package main
+
+import (
+ "github.com/tenntenn/gj"
+
+ "fmt"
+ "io/ioutil"
+ "os"
+)
+
+func main() {
+ jsonStr, _ := ioutil.ReadAll(os.Stdin)
+ v, _ := gj.New(jsonStr)
+ traversal(v.Slice(1, v.Len()))
+}
+
+func traversal(v *gj.Value) {
+
+ if v.IsArray() {
+ v.EachIndex(func(i int, v *gj.Value) {
+ traversal(v)
+ })
+ return
+ }
+
+ if v.IsObject() {
+
+ if v.Has("type") && v.Get("type").String() == "ResourceSendRequest" {
+ fmt.Println(v.Get("data").Get("url").String())
+ }
+
+ if v.Has("children") {
+ traversal(v.Get("children"))
+ }
+
+ return
+ }
+}
+```
+
+まだまだ改良の余地がありそうですが、個人で使う分にはいい感じかな。