Edited at

[Go言語] JSONを解析するのに、型作るのはめんどい

More than 5 years have passed since last update.

ChromeのDevToolsには、timelineという機能があり、Webアプリのパフォーマンスチューニングに使えます。このtimelineで記録したデータはJSONで保存ができます。

最初はjqを使って解析しようと思いましたが、スクリプトがだんだんと黒魔術臭がしてきました。

そこで、Go言語で解析しようと思ったのですが、正直このJSONのフォーマットがイマイチ分からないので、型が作れません。また、Chromeさんはバージョンがガンガン上がるので、いつフォーマットが変わるか分かりません。その度に型が変わるのは嫌です。

ということで、型を作らずにJSONを解析するライブラリ的なものを作ってみました。

reflectパッケージ的な感じに使えます。

こんな感じで使えます。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"))
}
}
}

まだまだ改良の余地がありそうですが、個人で使う分にはいい感じかな。