编组时间.unix时间戳记的时间

时间:2018-09-23 07:40:14

标签: json go

我有一个像这样的结构

type log struct {
    [...]
    Timestamp timestamp `json:"timestamp"`
}

并且我想将时间戳记作为unix时间戳记,而不是默认情况下执行的任何操作(2018-09-21T19:31:03.291Z

我已经尝试为此创建自定义类型:

type timestamp struct {
    time.Time
}

func (t timestamp) MarshalJSON() ([]byte, error) {
    return []byte(strconv.FormatInt(time.Time(t.Time).Unix(), 10)), nil
}

func (t *timestamp) UnmarshalJSON(data []byte) error {
    i, err := strconv.ParseInt(string(data[:]), 10, 64)
    if err != nil {
        return err
    }
    t = &timestamp{
        time.Unix(i, 0),
    }
    return nil
}

但是尝试从数据库中读取时总是出现错误can not unmarshal timestamp into *main.timestamp

for iter.Scan(&message.Text, &message.Timestamp) {

    userlogResult.Messages = append(userlogResult.Messages, message)
}
if err := iter.Close(); err != nil {
    log.Error(err)
}

它无法在此处解组时间戳。 https://github.com/gocql/gocql/blob/799fb0373110eaa4e2e71dd32a9b5903f80dca8f/helpers.go#L30的问题是它不使用Unmarshall函数。

编辑:我已经回答了自己的问题。

3 个答案:

答案 0 :(得分:1)

在将&timestamp{..}分配给t时,它是在更改指针,而所指向的值必须按以下方式进行

func (t *timestamp) UnmarshalJSON(data []byte) error {
    i, err := strconv.ParseInt(string(data[:]), 10, 64)
    if err != nil {
        return err
    }
    *t = timestamp{
        time.Unix(i, 0),
    }
    return nil
}

请找到代码here

修改

由于从数据库读取时无法解组,不是因为json.unmarshalling,所以必须实现 sql.Scanner 如果您使用的是sql

请在此处找到详细信息=> sql.Scanner

答案 1 :(得分:1)

我认为您的代码还可以-除了解组中的代码之外。您不显示代码在哪里进行编组/解组,这是实际错误所在的地方。

我在操场上工作。 Golang Playground

代替它(改变指针)

t = &timestamp{
  time.Unix(i, 0),
}

更改值

t.Time = time.Unix(i,0)

使用结构的主要功能

fmt.Println("First Log...")
l := log{Timestamp: timestamp{time.Now()}}
fmt.Println(l)

buf, err := json.Marshal(l)
if err != nil {
    panic(err)
}
fmt.Println("Marshalled to JSON...")
fmt.Printf("%s\n", buf)

var logCopy log
if err := json.Unmarshal(buf, &logCopy); err != nil {
    panic(err)
}
fmt.Println("UnMarshalled from JSON...")
fmt.Println(logCopy)

答案 2 :(得分:0)

在使很多人(对不起)和我自己感到困惑之后,我找到了解决方法。

现在,编组到json的工作仅需要修复gocql的兼容性,如下所示:

var ts time.Time
for iter.Scan(&message.Text, &ts) {
    message.Timestamp = timestamp{ts}

    userlogResult.Messages = append(userlogResult.Messages, message)
}