我有一个情况,我想将JSON数据解封为一个结构数组(或更多),这些结构都实现了一个公共接口。此外,实现接口的所有 eligble 结构类型都有一个公共字段,我在下面的示例中将其命名。鉴别器¹ 允许双唯一地为每个鉴别器值找到正确的结构类型。Foo
Bar
MyInterface
Discrimininator
但在解封过程中,代码并不“知道”哪个是正确的“目标”类型。取消封马连接失败。
不能将对象解封为 main 类型的 Go 值。我的接口
https://play.golang.org/p/Dw1hSgUezLH
package main
import (
"encoding/json"
"fmt"
)
type MyInterface interface {
// some other business logic methods go here!
GetDiscriminator() string // GetDiscriminator returns something like a key that is unique per struct type implementing the interface
}
type BaseStruct struct {
Discriminator string // will always be "Foo" for all Foos, will always be "Bar" for all Bars
}
type Foo struct {
BaseStruct
// actual fields of the struct don't matter. it's just important that they're different from Bar
FooField string
}
func (foo *Foo) GetDiscriminator() string {
return foo.Discriminator
}
type Bar struct {
BaseStruct
// actual fields of the struct don't matter. it's just important that they're different from Foo
BarField int
}
func (bar *Bar) GetDiscriminator() string {
return bar.Discriminator
}
其他语言
从 .NET 中已知的类型名称处理
在流行的.NET JSON框架牛顿软件中,这可以通过称为“类型名称处理”的东西来解决,或者可以使用自定义Json转换器来解决。该框架将在根级别向序列化/封送处理的 JSON 添加类似魔术键的东西,然后用于确定反序列化/取消封送处理的原始类型。"$type"
手术室中的多态性
¹ 当具有相同基数的多个类型的实例保存在同一表中时,在 ORM 中的术语“多态性”下也会出现类似的情况。通常引入一个鉴别器列,因此在上面的示例中名称。
皈依舞
相关分类