Golang JSON Marshal/Unmarshal postgres now()

我使用 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.go

package models


type 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 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) {

    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


料青山看我应如是
浏览 178回答 2
2回答

潇潇雨雨

JSON 需要引用字符串(在 JSON 中日期是一个字符串),但是您的MarshalJSON函数返回一个不带引号的字符串。我稍微修改了您的代码,现在可以正常工作了: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) {    // 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}

开心每一天1111

好像您使用了错误的格式。Postgres 使用 RFC 3339,它已经在time包中定义。这应该有效:time.Parse(time.RFC3339, string(b))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go