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