GoでnatureRemoのAPIレスポンス ( JSON ) をパースする
やったこと
GoでNatureRemoのAPIレスポンス結果をパースしたときの備忘録です。 natureRemoのAPIを叩き、レスポンス結果の気温、湿度、照度の値を取得する。
NatureRemoのAPIを実行する
curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer <TOKEN>"
■ レスポンス結果
[ { "name":"リビング", "id":"XXXXX", "created_at":"2019-04-20T12:49:11Z", "updated_at":"2019-04-26T14:35:59Z", "mac_address":"XXXXX", "serial_number":"XXXXX", "firmware_version":"Remo/1.0.77-g808448c", "temperature_offset":0, "humidity_offset":0, "users":[ { "id":"XXXXX", "nickname":"XXXXX", "superuser":true } ], "newest_events":{ "hu":{ "val":40, "created_at":"2019-04-27T04:34:06Z" }, "il":{ "val":234.6, "created_at":"2019-04-27T05:20:55Z" }, "te":{ "val":26.39, "created_at":"2019-04-27T04:38:10Z" } } } ]
GoでJSON結果をパースする
■ JSON結果をパースするために以下の構造体を定義する。
type Device struct { ID string `json:"id"` Name string `json:"name"` TemperatureOffset int32 `json:"temperature_offset"` HumidityOffset int32 `json:"humidity_offset"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` FirmwareVersion string `json:"firmware_version"` NewestEvents NewestEvents `json:"newest_events"` } type NewestEvents struct { Temperature SensorValue `json:"te"` Humidity SensorValue `json:"hu"` Illuminance SensorValue `json:"il"` } type SensorValue struct { Value float64 `json:"val"` CreatedAt string `json:"created_at"` }
JSONをデコードする方法
- デコードする方法
json.Unmarshal
(引用) []byte型のデータをデコードする
json.NewDecoder
(引用) http.Getで帰ってきたresp.Bodyなどの io.Reader型に対して使う
var devices []*Device req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Println("Error") } req.Header.Set("Authorization", "Bearer "+token) client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Error request") } err = json.NewDecoder(resp.Body).Decode(&devices) if err != nil { fmt.Println("Error decode") }
■ 気温、湿度、照度の値を出力
fmt.Printf("%v\t%v\t%v\n", devices[0].NewestEvents.Temperature.Value, devices[0].NewestEvents.Humidity.Value, devices[0].NewestEvents.Illuminance.Value) /* 実行結果 24.6 40 244.6 */