为了账号安全,请及时绑定邮箱和手机立即绑定

Golang JSON Marshal/Unmarshal postgres now()

Golang JSON Marshal/Unmarshal postgres now()

Go
料青山看我应如是 2021-09-10 10:20:11
我使用 postgres'now()作为我的created时间戳的默认值,它生成这个: id | user_id | title | slug | content |          created           ----+---------+-------+------+---------+----------------------------  1 |       1 | Foo   | foo  | bar     | 2014-12-16 19:41:31.428883  2 |       1 | Bar   | bar  | whiz    | 2014-12-17 02:03:31.566419我尝试使用json.Marshal并json.Unmarshal最终收到此错误:parsing time ""2014-12-16 19:41:31.428883"" as ""2006-01-02T15:04:05Z07:00"": cannot parse " 19:41:31.428883"" as "T"所以我决定尝试创建一个自定义时间,但似乎无法获得任何工作。Post.gopackage modelstype Post struct {    Id      int    `json:"id"`    UserId  int    `json:"user_id"`    Title   string `json:"title"`    Slug    string `json:"slug"`    Content string `json:"content"`    Created Tick   `json:"created"`    User    User   `json:"user"`}打勾package modelsimport (    "fmt"    "time")type Tick struct {    time.Time}var format = "2006-01-02T15:04:05.999999-07:00"func (t *Tick) MarshalJSON() ([]byte, error) {    return []byte(t.Time.Format(format)), nil}func (t *Tick) UnmarshalJSON(b []byte) (err error) {    b = b[1 : len(b)-1]    t.Time, err = time.Parse(format, string(b))    return}任何帮助将不胜感激,运行我在这里写的内容给了我这个:json: error calling MarshalJSON for type models.Tick: invalid character '0' after top-level value
查看完整描述

2 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

JSON 需要引用字符串(在 JSON 中日期是一个字符串),但是您的MarshalJSON函数返回一个不带引号的字符串。


我稍微修改了您的代码,现在可以正常工作了:


package models


import (

    "fmt"

    "time"

)


type Tick struct {

    time.Time

}


var format = "2006-01-02T15:04:05.999999-07:00"


func (t *Tick) MarshalJSON() ([]byte, error) {

    // using `append` to avoid string concatenation

    b := make([]byte, 0, len(format)+2)

    b = append(b, '"')

    b = append(b, t.Time.Format(format)...)

    b = append(b, '"')

    return b, nil

}


func (t *Tick) UnmarshalJSON(b []byte) (err error) {

    b = b[1 : len(b)-1]

    t.Time, err = time.Parse(format, string(b))

    return

}


查看完整回答
反对 回复 2021-09-10
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

好像您使用了错误的格式。Postgres 使用 RFC 3339,它已经在time包中定义。这应该有效:

time.Parse(time.RFC3339, string(b))


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信