見出し画像

Go-lang 自習 6日目「JSONパース」

Go言語自習の6日目です。JSONデータをパースします。

go言語には、標準でJSONパッケージがあるので、こちらを使っていきます。
https://golang.org/pkg/encoding/json/

JSON整形出力

Webサービスから取得したJSONデータを整形して標準出力に出力するには、json.Indentを使います。
https://golang.org/pkg/encoding/json/#Indent

	ba, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal("Error read")
	}
	var out bytes.Buffer
	json.Indent(&out, ba, "", "  ")
	out.WriteTo(os.Stdout)

JSONパース

JSONデータをGoのフォーマットに変換して取り込む方法は大きく2つの方法がある。
https://blog.golang.org/json

1. JSONフォーマットの構造体を用意してそこにjson.Unmarshalする
2.空の構造体interface{}を用意して、json.Unmarshalする

 json.Unmarshal

JSONの構造が分からない場合でも、空のinterface{}に入れてmap型に型アサーションという機能で変換することで、mapとして取り出せるようになる。

	var f interface{}
	if err := json.Unmarshal(ba, &f); err != nil {
		log.Fatal(err)
	}
	m := f.(map[string]interface{})
	for k, v := range m {
		fmt.Println(k, ":", v)
	}

入れ子になったJSON構造の取り出し

入れ子になったJSON構造も、mapで取り出した値をさらにmapに変換して取り出すことができる。

	var f interface{}
	if err := json.Unmarshal(ba, &f); err != nil {
		log.Fatal(err)
	}
	m := f.(map[string]interface{})
	prop := m["properties"].(map[string]interface{})
	for k, v := range prop {
		m := v.(map[string]interface{})
		fmt.Println(k)
		for k, v := range m {
			if k == "fields" {
				fmt.Println("-", k)
				sv := v.(map[string]interface{})
				for k, v := range sv {
					fmt.Println("--", k)
					value := v.(map[string]interface{})
					for k, v := range value {
						fmt.Println("---", k, v)
					}
				}
			} else {
				fmt.Println("-", k, v)
			}
		}
	}

いいなと思ったら応援しよう!