My Note

自己理解のためのブログ

GoでnatureRemoのAPIレスポンス ( JSON ) をパースする

やったこと

GoでNatureRemoのAPIレスポンス結果をパースしたときの備忘録です。 natureRemoのAPIを叩き、レスポンス結果の気温、湿度、照度の値を取得する。

NatureRemoのAPIを実行する

curlで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
*/        

ソースコード全体 ( GitHub )

github.com

参考

blog.golang.org

qiita.com