2 回答
TA贡献1839条经验 获得超15个赞
包车时间
导入“时间”
类型时间
A Time 表示具有纳秒级精度的瞬间。
使用时间的程序通常应该将它们作为值而不是指针来存储和传递。也就是说,时间变量和结构字段应该是 time.Time 类型,而不是 *time.Time。
我只是不断修复可能的问题,例如,time.Time
不是*time.Time
,真实日期等等,直到我得到一个合理的结果:
package main
import (
"encoding/json"
"fmt"
"strings"
"time"
)
type MyTime struct {
time.Time
}
func (m *MyTime) UnmarshalJSON(data []byte) error {
// Ignore null, like in the main JSON package.
if string(data) == "null" || string(data) == `""` {
return nil
}
// Fractional seconds are handled implicitly by Parse.
tt, err := time.Parse(`"`+time.RFC3339+`"`, string(data))
*m = MyTime{tt}
return err
}
type Added struct {
Added MyTime `json:"added"`
}
func main() {
st := strings.NewReader(`{"added": "2012-04-23T18:25:43.511Z"}`)
var a Added
err := json.NewDecoder(st).Decode(&a)
if err != nil {
panic(err)
}
fmt.Println(a)
}
游乐场:https://play.golang.org/p/Uusdp3DkXDU
输出:
{2012-04-23 18:25:43.511 +0000 UTC}
对于空 ( ""
) 日期字符串,time.Time
零值0001-01-01 00:00:00 +0000 UTC
:
游乐场:https://play.golang.org/p/eQoEyqBlhg2
输出:
{0001-01-01 00:00:00 +0000 UTC}
使用该time
IsZero
方法测试零值。
func(时间)IsZero
func (t Time) IsZero() boolIsZero 报告 t 是否代表零时刻,1 月 1 日,1 年,00:00:00 UTC。
TA贡献1816条经验 获得超4个赞
我认为您已经非常接近您的自定义编组器的解决方案。也许只是恢复正常日期的正常解码。这可能有助于:
type MyTime time.Time
func (m *MyTime) UnmarshalJSON(data []byte) error {
// Ignore null, like in the main JSON package.
if string(data) == "null" || string(data) == `""` {
return nil
}
return json.Unmarshal(data, (*time.Time)(m))
}
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报