goでjsonを臨機応変に扱う

最近はスクリプト言語を使う時に何を使うのが良いか迷います。

いや、もともと大して選んでいないんですが、Azure 関連の操作がメインだったので PowerShell をよく使っています。

PowerShell は C#っぽく書けるので悪くないんですが、改めて、OS 関係なく軽快に動いてくれる言語として go に注目しています。

プログラミングのリハビリを兼ねて go で Grafana を扱うコードを書いていたんですが、json を扱うところで苦労したのでノウハウをメモしておこうと思います。

encoding/json を使用する場合のお話になります。

1. 礼儀正しく扱う

json の構造をすべて把握している場合は、その構造を表現した type を宣言し、json.Unmarshal で変換された値を突っ込むことができます。

一部定義するだけでも良いようです。

例えば Grafana で GET /api/search/ を実行した結果の json を処理したい場合を考えます。

https://grafana.com/docs/grafana/latest/http_api/folder_dashboard_search/

得られる json には、id、uid、title、・・・といくつかの値が得られますが、例えばその中で title と uid の値だけ拾いたいときは下記のような感じです。

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type DashboardOverview struct {
    Title string `json:"title"`
    Uid   string `json:"uid"`
}

func main() {
    dashboardJson := Grafanaからjsonを取得する処理
    var dashboards []DashboardOverview
    if err := json.Unmarshal(dashboardJson, &dashboards); err != nil {
        log.Fatal(err)
    }
    fmt.Println(dashboards)
}

こうすると、変数 dashboards にダッシュボードの title と uid が配列で格納されます。

[Read More]