0

我看到如果我存储 QLDB ion.Timestamp,它不能直接转换为 json 时间字符串(YYYY-MM-DDThh:mm:ss.sssZ)。

例如:

// result of querying data object from histories(table, from, to)
var val map[string]interface{} 
err := ion.Unmarshal(tables.GetCurrentData(), &val) // from multiple table
val == map[string]interface {}{
        "createdAt": &ion.Timestamp{
            dateTime: time.Time{
                wall: 0x41cdb40,
                ext:  63746482222,
                loc:  (*time.Location)(nil),
            },
            precision:            0x6,
            kind:                 0x1,
            numFractionalSeconds: 0x3,
        },
        // some other nested column
    }
// val when marshalled to json will show:
{"createdAt":{}}

编组时如何强制ion.Timestamp进入 json 字符串或 int64 unix/epoch?或者我必须递归地检查地图是否是 ion.Timestamp,然后将地图覆盖为 json 字符串?

当前的解决方法(尚未递归)

for k, v := range data {
  switch t := v.(type) {
    case ion.Timestamp:
      data[k] = t.String()
    case *ion.Timestamp:
      if t != nil {
        data[k] = t.String()
      }
  }
}
4

1 回答 1

2

Timestamp以特定方式将 a 转换为 JSON,您可以 Marshaler实现Timestamp.

例如,要将其转换为 Unix 时间戳,请使用此函数(在 Go Playground 中尝试)。

func (t Timestamp) MarshalJSON() ([]byte, error) {
    return json.Marshal(t.GetDateTime().Unix())
}

要将其转换为日期字符串,请使用此函数(在 Go Playground 中尝试)。

func (t Timestamp) MarshalJSON() ([]byte, error) {
    return json.Marshal(t.GetDateTime())
}

如需进一步阅读,请参阅该encoding/json软件包的文档,或查看这篇关于高级编码和解码的 Gopher Academy 博客文章。

于 2022-02-15T18:25:58.000 回答