概要
- wordpress 4.7にはREST APIで記事の一覧や内容を取得できる機能があります
- これを利用してgolangで記事の一覧を取得するクライアントを作成したが時刻のパースでエラーが発生します
- 何故かとおもったらAPIの返す時刻のフォーマットがRFC3339「もどき」でGoがパース不可能になっていました
wordpress4.7のREST APIについて
- REST APIで返ってくる値の形式は以下のようになっています
こちらのページのjsonを引用させてもらうと以下のようになります
[
{
"id": 14687,
"date": "2017-01-12T12:00:30",
"date_gmt": "2017-01-12T03:00:30",
"guid": {
"rendered": "http://loumo.jp/?p=14687"
},
"modified": "2017-01-07T19:13:26",
"modified_gmt": "2017-01-07T10:13:26",
略
Goでパースできない
上記のようなjsonをパースするときGoでは以下のようにstructを宣言してパースを行いますが
type News struct {
Date time.Time `json:"date"`
DateGmt time.Time `json:"date_gmt"`
}
var newsResponse []*News
decoder := json.NewDecoder(res.Body) // APIから取得してきます
if err := decoder.Decode(&newsResponse); err != nil {
fmt.Println(err)
return nil, err
}
このときこのようなエラーが出ます
parsing time ""2019-02-26T02:04:34"" as ""2006-01-02T15:04:05Z07:00"": cannot parse """ as "Z07:00"
なぜパースができないのか
- GoはRFC3339に則ってパースしようとしますが、Wordpressの吐いている時刻のフォーマットが正しいRFC3339ではないことが原因のようです
"date": "2017-01-12T12:00:30"
- 正しくは
"2017-01-12T12:00:30Z"
または"2017-01-12T12:00:30+0900"
などでなければいけません - ということでWordpressのREST APIの時刻をGolangで扱うときは気をつけましょう....