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

February 3, 2014

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

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"))
		}
	}
}

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