はじめに
Go言語でカスタマイズされたJSONの生成方法を実例を交えて説明します
RestFulAPIを実装する等の場合に使います
やる内容
type MyTime struct {
Time time.Time `json:"time"`
}
上記のtime.Time
型を持つ構造体MyTime
から
{"time":"2016-04-30 01:30:54"
というような形式のJSONへとエンコードすることが目的です。
そのまま構造体をJSONへエンコードすると
plane.go
package main
import (
"fmt"
"time"
"encoding/json"
)
type MyTime struct {
Time time.Time `json:"time"`
}
func main() {
// MyTime初期化
dt, _ := time.Parse("2006/01/02 15:04:05", "2016/04/01 05:21:33")
mt := &MyTime{Time:dt}
// JSON変換
m_bytes, _ := json.Marshal(mt)
// 出力
fmt.Println(string(m_bytes))
}
出力
{"time":"2016-04-01T05:21:33Z"}
このTとZが今回は不要です。
ちなみに、timeパッケージの公式を見ると
time#MarshalJSONfunc (t Time) MarshalJSON() ([]byte, error)
MarshalJSON implements the json.Marshaler interface. The time is a quoted string in RFC 3339 format, with sub-second precision added if present.
とあり、TとかZは、RFC3339という表記の規格によるもので、time.Time`型はデフォルトではこの規格ということです。
このままでは希望通りの形式にならないので、MarshalJSON
をオーバーライドしてJSONをカスタマイズします。
MashalJSONをオーバーライドする
overrideMarshalJSON.go
package main
import (
"fmt"
"time"
"encoding/json"
)
type MyTime struct {
Time time.Time `json:"time"`
}
// @Override
func (m *MyTime) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("{\"time\":\"%s\"}", m.Time.Format("2006-01-02 15:04:05"))), nil
}
func main() {
// MyTime初期化
dt, _ := time.Parse("2006/01/02 15:04:05", "2016/04/01 05:21:33")
mt := &MyTime{Time:dt}
// JSON変換
m_bytes, _ := json.Marshal(mt)
// 出力
fmt.Println(string(m_bytes))
}
出力
{"time":"2016-04-01 05:21:33"}
time.Time
で定義されていたMarshalJSON
メソッドがオーバーライドされて希望通りになりました!