我有一个像这样的结构
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 = ×tamp{
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函数。
编辑:我已经回答了自己的问题。
答案 0 :(得分:1)
在将×tamp{..}
分配给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 = ×tamp{
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)
}