Golang Go语言中json时间转struct问题

发布于 1周前 作者 yibo5220 来自 Go语言

Golang Go语言中json时间转struct问题
问题 1:
json 中的时间格式不标准"create_time":"2021-08-14 11:36:37"
在转为 struct 时,不能直接转为 time.Time 。
网上找了别人写好的 UnmarshalJSON 方法,依然不能解析。

问题 2:
将 struct 改为 string,输出是空。
在 go 中,json.Unmarshal 解析前的代码是 bytes 数组。手动执行 curl,得到的结果是有的。

4 回复

自定义类型并实现 Unmarshal/Marshal 方法

更多关于Golang Go语言中json时间转struct问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go<br>package util<br><br>import "time"<br><br>func ParseTime(value string) (time.Time, error) {<br> loc := time.FixedZone("UTC+8", +8*60*60)<br><br> return time.ParseInLocation("2006-01-02 15:04:05", value, loc)<br>}<br><br>func TimeFormat(t time.Time) string {<br> loc := time.FixedZone("UTC+8", +8*60*60)<br> return <a target="_blank" href="http://t.In" rel="nofollow noopener">t.In</a>(loc).Format("2006-01-02 15:04:05")<br>}<br><br>type MyTime time.Time<br><br>func (myT MyTime) MarshalText() (data []byte, err error) {<br> t := time.Time(myT)<br> data = []byte(TimeFormat(t))<br> return<br>}<br><br>func (myT *MyTime) UnmarshalText(text []byte) (err error) {<br> t := (*time.Time)(myT)<br> *t, err = ParseTime(string(text))<br> return<br>}<br>

然后

go<br>type MonitorDiagnosisItem struct {<br> Time util.MyTime `json:"time"`<br>}<br>

学会了吗?

好详细,谢谢。我用了两个 struct 做转换,回头试试这种写法

在Go语言中,将JSON中的时间字符串转换为struct中的时间类型(通常是time.Time)是一个常见问题。以下是一些常见的解决方法:

  1. 自定义时间格式解析: 使用time.Time类型并为其定义自定义的UnmarshalJSON方法。例如,如果你的JSON时间格式是"2006-01-02T15:04:05Z07:00",你可以这样做:

    type MyStruct struct {
        Timestamp time.Time `json:"timestamp"`
    }
    
    func (m *MyStruct) UnmarshalJSON(data []byte) error {
        type Alias MyStruct
        aux := &struct {
            Timestamp json.RawMessage `json:"timestamp"`
            *Alias
        }{
            Alias: (*Alias)(m),
        }
        if err := json.Unmarshal(data, &aux); err != nil {
            return err
        }
        var err error
        aux.Timestamp, err = time.Parse(time.RFC3339, string(aux.Timestamp))
        if err != nil {
            return err
        }
        return nil
    }
    
  2. 使用标准库的时间解析: 如果你的时间格式符合标准库的时间格式(如RFC3339),可以直接使用time.Time类型,并且JSON解析器会自动处理。

  3. 使用第三方库: 使用如github.com/dustin/go-jsonpointergithub.com/square/go-jose等第三方库,这些库提供了更灵活的时间处理功能。

确保你的时间格式字符串与JSON中的时间格式完全匹配,以避免解析错误。在复杂的JSON结构中,自定义UnmarshalJSON方法可以提供更多的灵活性和控制。

回到顶部