使用Go解析.Net JSON日期

约翰·伦斯比:

如何使用Go解析此.Net JSON日期?该值未分配回来。它似乎可以解析到日期字段。

package main

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

type MyStruct struct {
    FirstField string
    SomeTime time.Time
    LastField string
}

type MyStructSlice struct {
    MyStructs []MyStruct
}

func main() {
    var s MyStructSlice 
    str := `{"MyStructs":[{"FirstField":"123", "SomeTime":"\/Date(1432187580000-0500)\/", "LastField":"456"}]}`
    json.Unmarshal([]byte(str), &s)
    fmt.Println(s)
}

去操场

icza:

首先,您建模错误,它没有对JSON中的数据结构建模。它应该是:

type Data struct {
    Data []MyStruct `json:"data`
}
type MyStruct struct {
    SomeTime string
}

可以使用它,在Go Playground上尝试一下

问题是我们还有时间string

现在,如果您想SomeTime成为time.Time,则需要自己解析它,可以通过实现json.Unmarshaler以下方法来实现

type Data struct {
    Data []MyStruct `json:"data`
}

type MyStruct struct {
    SomeTime time.Time
}

func (m *MyStruct) UnmarshalJSON(data []byte) error {
    // First unmashal it into a string:
    ms := struct{ SomeTime string }{}
    if err := json.Unmarshal(data, &ms); err != nil {
        return err
    }

    s := ms.SomeTime

    // s is of format: "/Date(1432187580000-0500)/"
    // extract millis and time zone offset hours
    i1 := strings.Index(s, "(")
    i3 := strings.Index(s, ")")
    i2 := strings.Index(s, "-")
    if i2 < 0 {
        i2 = strings.Index(s, "+")
    }
    if i1 < 0 || i2 < 0 || i3 < 0 {
        return errors.New("Invalid format")
    }

    millis, err := strconv.ParseInt(s[i1+1:i2], 10, 64)
    if err != nil {
        return err
    }
    m.SomeTime = time.Unix(0, millis*1000000)

    // Apply timezone:
    zoneHours, err := strconv.ParseInt(s[i2:i3], 10, 64)
    if err != nil {
        return err
    }
    zone := time.FixedZone("something", int(zoneHours)*3600)
    m.SomeTime = m.SomeTime.In(zone)
    return nil
}

Go Playground上尝试一下

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章