如何从golang中的json解析非标准时间格式?

zol*_*ola 11 time go

让我说我有以下json

{
    name: "John",
    birth_date: "1996-10-07"
}
Run Code Online (Sandbox Code Playgroud)

我想将其解码为以下结构

type Person struct {
    Name string `json:"name"`
    BirthDate time.Time `json:"birth_date"`
}
Run Code Online (Sandbox Code Playgroud)

像这样

person := Person{}

decoder := json.NewDecoder(req.Body);

if err := decoder.Decode(&person); err != nil {
    log.Println(err)
}
Run Code Online (Sandbox Code Playgroud)

这给了我错误 parsing time ""1996-10-07"" as ""2006-01-02T15:04:05Z07:00"": cannot parse """ as "T"

如果我要手动解析它我会这样做

t, err := time.Parse("2006-01-02", "1996-10-07")
Run Code Online (Sandbox Code Playgroud)

但是当时间值来自json字符串时,我如何让解码器以上述格式解析它?

Kir*_*ril 13

当你需要实现自定义marshal和unmarshal函数时就是这种情况.

UnmarshalJSON(b []byte) error { ... }

MarshalJSON() ([]byte, error) { ... }
Run Code Online (Sandbox Code Playgroud)

通过遵循json包的Golang文档中的示例,您可以获得如下内容:

// first create a type alias
type JsonBirthDate time.Time

// Add that to your struct
type Person struct {
    Name string `json:"name"`
    BirthDate JsonBirthDate `json:"birth_date"`
}

// imeplement Marshaler und Unmarshalere interface
func (j *JsonBirthDate) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), "\"")
    t, err := time.Parse("2006-01-02", s)
    if err != nil {
        return err
    }
    *j = JsonBirthDate(t)
    return nil
}

func (j JsonBirthDate) MarshalJSON() ([]byte, error) {
    return json.Marshal(j)
}

// Maybe a Format function for printing your date
func (j JsonBirthDate) Format(s string) string {
    t := time.Time(j)
    return t.Format(s)
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是JB在`*j = JB(t)`行? (4认同)
  • MarshalJSON()方法由于间接调用自身而导致堆栈溢出恐慌。 (2认同)

小智 6

如果有很多结构体并且您只是实现自定义编组和解组函数,那么需要做很多工作。您可以使用另一个 lib\xef\xbc\x8c 代替,例如 json-iterator 扩展jsontime

\n\n
import "github.com/liamylian/jsontime"\n\nvar json = jsontime.ConfigWithCustomTimeFormat\n\ntype Book struct {\n    Id        int           `json:"id"`\n    UpdatedAt *time.Time    `json:"updated_at" time_format:"sql_date" time_utc:"true"`\n    CreatedAt time.Time     `json:"created_at" time_format:"sql_datetime" time_location:"UTC"`\n}\n
Run Code Online (Sandbox Code Playgroud)\n