json - 未调用自定义 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
但我希望至少可以打印消息。
我究竟做错了什么?
解决方案
JSONUnmarshal 函数位于指针接收器上。使用指针值访问该方法。
switch vehicleType {
case "truck":
myVehicle = &truck{} // <-- add & here
}
err := json.Unmarshal(data, myVehicle) // <-- & not needed here
推荐阅读
- swift - SwiftUI 参数传递给不带参数的调用
- java - 在 ServletContext 资源 [/WEB-INF/spring-mvc-crud-demo-servlet.xml] 中定义名称为“sessionFactory”的 bean 创建错误:
- pandas - 使用 pandas 进行 Postgres 查询 - 添加显式类型转换
- flutter - Flutter google_mobile_ads 在广告上通知 UI 无法加载
- python - 如何在一个 Tkinter 框架中添加多个表
- python - Pandas:条形图,数据框中重复的 x 列中有两个条形图
- visual-studio-code - python3类继承引用和vs代码没有IntelliSense?
- next.js - 在 Next.js 中创建动态 index.js 页面
- wordpress - 如何向 WooCommerce Gutenberg 块添加标记?
- ios - 颤振运行错误命令 PhaseScriptExecution 失败,退出代码为非零,但适用于 Xcode