我定义了一些结构,例如
type EventPayload struct {
IsAdded bool `json:"is_added"`
IsUpdated bool `json:"is_updated"`
IsDeleted bool `json:"is_deleted"`
}
type HubEvent struct {
Time string `json:"time"`
Payload interface{} `json:"payload"`
}
type EventRecord struct {
InputEventPayload HubEvent `json:"inputEventPayload"`
EventID string `json:"eventId"`
}
现在,我有一个
EventRecord
数组,我需要对其进行迭代。我需要做两件事:
InputEventPayload
是否存在InputEventPayload.Payload
接口转换为 EventPayload
结构我创建了一个测试文件来测试我的代码,在其中传递
EventRecords
数组
[]EventRecord{
{
EventID: "eventID-1",
},
{
EventID: "eventID-2",
InputEventPayload: HubEvent{
Payload: EventPayload{
IsAdded: true,
IsUpdated: false,
},
},
},
}
我的代码看起来像这样
for _, record := range EventRecords {
// check if the InputEventPayload exists in the record
if record.InputEventPayload != (HubEvent{}) {
// typecast
payload := record.InputEventPayload.Payload.(EventPayload)
// do something with the payload
}
}
我不知道这是否是检查字段
InputEventPayload
是否存在的正确方法。
其次,当代码尝试进行类型转换时,它给出了以下错误
interface conversion: interface {} is map[string]interface {}, not EventPayload
这里重要的是我无法更改此处任何结构的架构
问题(也与您的测试数据有关)是您将 JSON 反序列化为
interface{}
,默认创建一个对象 map[string]interface{}
。
一种解决方案可能是再次序列化和反序列化:
for _, record := range EventRecords {
// check if the InputEventPayload exists in the record
if record.InputEventPayload.Payload != nil {
tmp, err := json.Marshal(record.InputEventPayload.Payload)
if err != nil {
panic(err)
}
var event EventPayload
if err := json.Unmarshal(tmp, &event); err != nil {
panic(err)
}
fmt.Println(event)
}
}
更好的是直接使用正确的结构,你提到你不能这样做。为了提出更好的解决方案,我们可能需要更多地了解您的问题以及为什么结构是这样的,并且是不可更改的。