首页 > 解决方案 > 未调用自定义 UnmarshalJSON

问题描述

我有一个由几个结构实现的接口。在我的一种方法中,我基于给定的字符串实例化结构,然后将 json 解析为定义的结构。为此,我实现了 UnmarshalJSON,但它从未被调用过。

界面:

type vehicle interface {
    vehicleType() string
    numberOfWheels() int
    EngineType() string
}

实现接口的两个结构:

type truck struct {
    loadCapacity  int
    capacityUnits string
}

func (t truck) vehicleType() string {
    return "Truck"
}

func (t truck) numberOfWheels() int {
    return 6
}

func (t truck) EngineType() string {
    return "Gasoline"
}

func (t *truck) UnmarshalJSON(data []byte) error {
    fmt.Println("Here in custom unmarshal")
    return nil
}

// -------------------------------------------
type ev struct {
    capacityInKWh int
}

func (e ev) vehicleType() string {
    return "Electric Vehicle"
}

func (e ev) numberOfWheels() int {
    return 4
}

func (e ev) EngineType() string {
    return "Electric"
}

func (e ev) Capacity() int {
    return e.capacityInKWh
}

请注意,我的truck结构还实现了自定义 UnmarshalJSON。

现在,我主要尝试执行以下操作:

func main() {
    jsonData := []byte(`{"loadCapacity": 1000, "capacityUnits": "lb"}`)
    vehicleType := "truck"

    processVehicle(vehicleType, jsonData)
}

func processVehicle(vehicleType string, data []byte) {
    var myVehicle vehicle

    fmt.Println("Processing vehicle...")

    switch vehicleType {
    case "truck":
        myVehicle = truck{}
    }

    err := json.Unmarshal(data, &myVehicle)
    if err != nil {
        fmt.Println(err.Error())
        return
    }

    fmt.Println(myVehicle)
}

但我收到以下错误:

json:无法将对象解组为 main.vehicle 类型的 Go 值

UnmarshalJSON我知道在实现中没有实际的主体,truck但我希望至少可以打印消息。

我究竟做错了什么?

标签: jsongointerfaceunmarshallinggo-interface

解决方案


JSONUnmarshal 函数位于指针接收器上。使用指针值访问该方法。

switch vehicleType {
case "truck":
    myVehicle = &truck{}  // <-- add & here
}

err := json.Unmarshal(data, myVehicle) // <-- & not needed here

在 Go Playground 上运行它


推荐阅读