Использование json.Unmarshal выдает ParseError при попытке преобразовать строку в формате unix в time.Time - PullRequest
0 голосов
/ 10 июля 2019

У меня есть JSON файл со следующим содержимым:

{  ...
   "body": "{\"timestampFrom\":\"154087600\"}"
   ...
}

Когда я пытаюсь выполнить:

if err := json.Unmarshal([]byte(apiGatewayEvent.Body), &config); err != nil {
            glog.Errorf("Error occurred while trying to unmarshal body of APIGatewayProxyRequest. Error message - %v", err)
            return nil, err
        }

Я получаю:

Произошла ошибка при попытке демонтировать тело APIGatewayProxyRequest.

Сообщение об ошибке - время анализа "" 1540857600 "" как "" 2006-01-02T15: 04: 05Z07: 00 "": невозможно проанализировать "857600" "как" - "

Дело в том, что я всегда получаю входные данные в формате UNIX, и мне нужно преобразовать его в time.Time. Как мне это точно сделать?

1 Ответ

1 голос
/ 10 июля 2019

Вы можете объявить свой собственный тип времени и сделать его реализующим json.Unmarshaller, например как то так:

package main

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

var data = []byte(`{"timestamp": 1562764768}`)

type myTime time.Time

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

func (mt *myTime) String() string {
    return time.Time(*mt).String()
}

type body struct {
    Timestamp *myTime `json:"timestamp"`
}

func main() {
    var b body
    err := json.Unmarshal(data, &b)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%+v\n", b)
}

Игровая площадка Go

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...