为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 使用 json unmarshall 获取日期时间值

Golang 使用 json unmarshall 获取日期时间值

Go
呼啦一阵风 2022-12-05 17:18:29
在我的代码中,一个方法监听一个 redis 队列。我将 Redis 发送的数据作为以下代码示例的“有效负载”变量。“currenttime”变量是一个time.time,但json.unmarshall 将其更改为字符串值。我怎样才能防止这种情况发生?我想从当前时间获取 time.time 数据。“值”数据也动态变化。“计数”、“名称”和“当前时间”变量名称每次都可以更改。我可以只看值。type Event struct {    ID    string      `json:"id"`    Value interface{} `json:"value"`}func main() {    payload := "{\"id\":\"61e310f79b9a4db146a8cb7d\",\"value\":{\"Value\":{\"count\":55,\"currenttime\":\"2022-02-23T00:00:00Z\",\"name\":\"numberone\"}}}"    var event Event    if err := json.Unmarshal([]byte(payload), &event); err != nil {        fmt.Println(err)    }    fmt.Println(event)}
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

如果Event.Value.Value有一个预定义的结构

使用适当的结构来为您的输入 JSON 建模,您可以在其中使用time.TimeJSONcurrenttime属性:


type Event struct {

    ID    string `json:"id"`

    Value struct {

        Value struct {

            Count       int       `json:"count"`

            CurrentTime time.Time `json:"currenttime"`

            Name        string    `json:"name"`

        } `json:"Value"`

    } `json:"value"`

}

像这样打印:


fmt.Println(event)

fmt.Printf("%+v\n", event)

fmt.Printf("%T %v\n", event.Value.Value.CurrentTime, event.Value.Value.CurrentTime)

输出是(在Go Playground上试试):


{61e310f79b9a4db146a8cb7d {{55 2022-02-23 00:00:00 +0000 UTC numberone}}}

{ID:61e310f79b9a4db146a8cb7d Value:{Value:{Count:55 CurrentTime:2022-02-23 00:00:00 +0000 UTC Name:numberone}}}

time.Time 2022-02-23 00:00:00 +0000 UTC

如果Event.Value.Value没有预定义结构

如果 的属性Event.Value.Value可以动态变化,请使用映射 ( map[string]interface{}) 解组。因为我们不能告诉这个时间我们想要一个time.Time值(其他属性不保存时间值),所以时间字段将被解组为一个string. 因此,您必须遍历其值并尝试使用正确的布局来解析这些值。如果成功地解析它,我们就得到了我们想要的。


它看起来像这样:


type Event struct {

    ID    string `json:"id"`

    Value struct {

        Value map[string]interface{} `json:"Value"`

    } `json:"value"`

}


func main() {


    payload := "{\"id\":\"61e310f79b9a4db146a8cb7d\",\"value\":{\"Value\":{\"foo\":55,\"mytime\":\"2022-02-23T00:00:00Z\",\"bar\":\"numberone\"}}}"

    var event Event

    if err := json.Unmarshal([]byte(payload), &event); err != nil {

        fmt.Println(err)

    }


    for _, v := range event.Value.Value {

        if s, ok := v.(string); ok {

            t, err := time.Parse("2006-01-02T15:04:05Z", s)

            if err == nil {

                fmt.Println("Found time:", t)

            }

        }

    }

}

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


Found time: 2022-02-23 00:00:00 +0000 UTC


查看完整回答
反对 回复 2022-12-05
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信