MST

星途 面试题库

面试题:Go的json包自定义序列化和反序列化的深度应用

有一个结构体,其中包含一个自定义类型的字段,自定义类型内部包含一个时间.Time类型的字段。要求在使用encoding/json包进行序列化和反序列化时,对这个自定义类型实现自定义的序列化和反序列化逻辑,使得时间字段以特定的格式(如"2006 - 01 - 02 15:04:05")进行处理。请给出完整的结构体定义、自定义序列化和反序列化方法的实现代码。
17.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

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

// 自定义类型
type MyTime struct {
    Time time.Time
}

// 实现json.Marshaler接口的MarshalJSON方法
func (mt MyTime) MarshalJSON() ([]byte, error) {
    return json.Marshal(mt.Time.Format("2006 - 01 - 02 15:04:05"))
}

// 实现json.Unmarshaler接口的UnmarshalJSON方法
func (mt *MyTime) UnmarshalJSON(data []byte) error {
    var s string
    if err := json.Unmarshal(data, &s); err != nil {
        return err
    }
    t, err := time.Parse("2006 - 01 - 02 15:04:05", s)
    if err != nil {
        return err
    }
    mt.Time = t
    return nil
}

// 包含自定义类型字段的结构体
type MyStruct struct {
    MyTimeField MyTime
}

func main() {
    // 示例数据
    myTime := MyTime{Time: time.Now()}
    myStruct := MyStruct{MyTimeField: myTime}

    // 序列化
    serialized, err := json.MarshalIndent(myStruct, "", "  ")
    if err != nil {
        fmt.Println("序列化错误:", err)
        return
    }
    fmt.Println("序列化结果:\n", string(serialized))

    // 反序列化
    var unmarshaled MyStruct
    if err := json.Unmarshal(serialized, &unmarshaled); err != nil {
        fmt.Println("反序列化错误:", err)
        return
    }
    fmt.Println("反序列化结果:", unmarshaled.MyTimeField.Time)
}