如何处理 GO 结构中 JSON 的日期字段

dig*_*123 0 json struct go unmarshalling

我有一个 JSON 内容,其中包含一些日期字段,例如“解决日期”、“创建”和“更新”,如下所示

{
   "expand":"names,schema",
   "startAt":0,
   "maxResults":50,
   "total":1,
   "issues":[
      {
         "expand":"operations,versionedRepresentations,editmeta,changelog,renderedFields",
         "id":"id",
         "self":"https://url1",
         "key":"key1",
         "fields":{
            "summary":"Summary-1",
            "customfield_10406":null,
            "resolutiondate":"2021-06-10T10:07:35.000+0000",
            "created":"2021-06-10T10:05:24.000+0000",
            "description":"Description-1",
            ...
            ...
            ...
}
Run Code Online (Sandbox Code Playgroud)

我正在将此 JSON 数据解组到 GO 结构中,并将数据保存在 Excel 工作表中。一切都按预期工作,唯一的问题是我在 GO 结构中将日期字段定义为字符串数据类型,如下所示:

        Resolved           string `json:"resolutiondate,omitempty"`
        Created            string `json:"created,omitempty"`
Run Code Online (Sandbox Code Playgroud)

因此,保存在 Excel 文件中的最终数据如下所示:

在此输入图像描述

但我想将它们保存为 Excel 工作表中的日期数据类型,采用用户定义的格式 -mm/dd/yyyy。如何有效地使用timeGolang的包来实现这一点?请帮忙。

注意:我将无法分享我的完整代码和完整的 JSON 文件。

Men*_*nyT 10

要从自定义格式解组,您需要创建time.Time包装器并实现json.Unmarshaler接口。

type CustomTime struct {
    time.Time
}

func (t *CustomTime) UnmarshalJSON(b []byte) (err error) {
    date, err := time.Parse(`"2006-01-02T15:04:05.000-0700"`, string(b))
    if err != nil {
        return err
    }
    t.Time = date
    return
}
Run Code Online (Sandbox Code Playgroud)

现在将您的时间字段指定为CustomTime

Resolved           CustomTime `json:"resolutiondate,omitempty"`
Created            CustomTime `json:"created,omitempty"`
Run Code Online (Sandbox Code Playgroud)

为了写入 Excel,您需要提供有关您的实施的更多信息。

但示例解决方案:

type CustomTime struct {
    time.Time
}

func (t *CustomTime) UnmarshalJSON(b []byte) (err error) {
    date, err := time.Parse(`"2006-01-02T15:04:05.000-0700"`, string(b))
    if err != nil {
        return err
    }
    t.Time = date
    return
}
Run Code Online (Sandbox Code Playgroud)

  • 不必费心从字节中剥离 `"` - 只需将引号直接放入格式字符串中即可,例如 `date, err := time.Parse(\`"2006-01-02T15:04:05.000+0000"\`, s)` (3认同)