接口转换:interface {}是map[string]interface {},不是

问题描述 投票:0回答:1

我定义了一些结构,例如

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
数组,我需要对其进行迭代。我需要做两件事:

  1. 对于数组中的每个 eventRecord,我需要检查
    InputEventPayload
    是否存在
  2. 如果是这样,我需要将
    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

这里重要的是我无法更改此处任何结构的架构

go struct interface
1个回答
0
投票

问题(也与您的测试数据有关)是您将 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)
        }
    }

更好的是直接使用正确的结构,你提到你不能这样做。为了提出更好的解决方案,我们可能需要更多地了解您的问题以及为什么结构是这样的,并且是不可更改的。

© www.soinside.com 2019 - 2024. All rights reserved.