1. tenntenn

    Posted

    tenntenn
Changes in title
+[Go言語] JSONを解析するのに、型作るのはめんどい
Changes in tags
Changes in body
Source | HTML | Preview

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

        return
    }
}

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