最近Goばかり書いている。今回はJSONのパースという基本的な事をやる。

使用するJSON

今回は以下のJSONファイルを使用する。

{
  "foo": 1,
  "bar": {
    "text": "yay"
  },
  "baz": [
    1,
    2,
    3
  ]
}

foo, bar, bazの属性があり、barはtextを属性に持つオブジェクトとなっている。

型定義

前述のJSONに沿った形で型定義をする。

package main

type Bar struct {
	Text string `json:text`
}

type Example struct {
	Foo int64   `json:foo`
	Bar Bar     `json:bar`
	Baz []int64 `json:baz`
}

ExampleとBarという型を定義した。ExampleはJSONの全体を表す型でBarはbar属性を表わす型となっている。 各属性の型指定の後ろに記述しているものは、JSONではどのような属性名になっているかを指定するものだ。 Goは属性名の先頭文字が大文字でなければprivateと判断され外からアクセスできなくなってしまう。 そのため外からアクセスする可能性のあるものは全て先頭を大文字で始めることになるが、JSONの場合はかならずそうとは限らない。 そこでその対応を指定するために json:attributevalue と言った形式で指定する。 また属性がオプショナルかどうかなどもここで指定する。

json.Unmarshal()を使用したパース

先程の型定義を使用し json.Unmarshal() を用いてJSONをパースする。

package main

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

func main() {
	buf, err := os.ReadFile("test.json")
	if err != nil {
		panic("NG")
	}
	example := Example{}
	json.Unmarshal(buf, &example)
	fmt.Println(example)
}

os.ReadFile() でJSONファイルを読み込む。次にExample型の領域を確保する。 json.UNmarshal() にJSONファイルから読み込んだデータとExample型の領域のアドレスを渡すと、パース可能な場合は値がセットされる。

まとめ

Goで json.Unmarshal() を用いてJSONをパースした。