Время JSON маршалов до 0 раз - PullRequest
0 голосов
/ 20 мая 2019

У меня есть следующий код, который в первую очередь маршалы и немаршалы структура времени.Вот код

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 Ответ

4 голосов
/ 20 мая 2019

Go ветеринар точно скажет вам, в чем проблема:

. / 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...