时间JSON封送至0时间

时间:2019-05-20 09:56:15

标签: json go time

我有以下代码,主要用于编组和取消编组时间结构。这是代码

package main

import (
    "fmt"
    "time"
    "encoding/json"
)

type check struct{
    A time.Time `json:"a"`
}

func main(){
    ds := check{A:time.Now().Truncate(0)}
    fmt.Println(ds)
    dd, _ := json.Marshal(ds)
    d2 := check {}
    json.Unmarshal(dd, d2)
    fmt.Println(d2)
}

这是它产生的输出

{2019-05-20 15:20:16.247914 +0530 IST}
{0001-01-01 00:00:00 +0000 UTC}

第一行是原始时间,第二行是解组后的时间。为什么JSON转换会导致信息丢失?如何预防呢? 谢谢。

1 个答案:

答案 0 :(得分:4)

兽医会准确地告诉您问题出在哪里:

  

./ prog.go:18:16:Unmarshal的调用将非指针作为第二个参数传递

从不忽略错误!您至少可以做的是打印它:

ds := check{A: time.Now().Truncate(0)}
fmt.Println(ds)
dd, err := json.Marshal(ds)
fmt.Println(err)
d2 := check{}
err = json.Unmarshal(dd, d2)
fmt.Println(err)
fmt.Println(d2)

这将输出(在Go Playground上尝试):

{2009-11-10 23:00:00 +0000 UTC}
<nil>
json: Unmarshal(non-pointer main.check)
{0001-01-01 00:00:00 +0000 UTC}

您必须将指针传递给json.Unmarshal(),以使其能够编组(更改)您的值:

err = json.Unmarshal(dd, &d2)

通过此更改,输出将是(在Go Playground上尝试):

{2009-11-10 23:00:00 +0000 UTC}
<nil>
<nil>
{2009-11-10 23:00:00 +0000 UTC}