【问题标题】:Dynamic Type in UnmarshalUnmarshal 中的动态类型
【发布时间】:2018-03-06 12:37:16
【问题描述】:

我目前遇到以下问题:

我通过 websocket 得到一个 []byte / 字符串,看起来像

eventname {"JSON": "data", "In": "different formats"}

我通过 eventname 和 JSON 数据之间的空格分割字符串,根据 eventname,我想将 JSON 数据 json.Unmarshal() 转换为特定类型或 var特定类型,以确保其所有类型都是安全的。

所以我可能会有一个地图,其中包含所有可能的事件名称和 JSON 数据的相应类型,但我不确定如何保存类型,可能是通过引用还是通过字符串化名称?

type EventTypeList map[string]*interface{}

type EventTypeList map[string]string

所以我可以查找事件是否在 EventTypeList 中,然后让 Unmarshal func 将数据解析为映射中的类型。

所以基本上不是具体类型“SpecificData”:

type SpecificData struct {
    JSON string
    In   string
}

socketData := SpecificData{}
err := json.Unmarshal(jsonData, &socketData)

我想通过 EventTypeList 中的类型动态创建 socketData var

socketData := [dynamically determine this Type from EventTypeList]{}

在我将数据解析为该类型后,我想调用该事件的所有侦听器并为它们提供正确类型的 socketData,以便它们可以处理预期的数据。

但我真的不确定我将如何做到这一点,如果这是可能的,或者这是否是正确的方法......

感谢您的帮助!

【问题讨论】:

  • 而不是在地图中保存类型,为什么你没有功能。喜欢map[string]func(b []byte) (interface{}, error)
  • @vedhavyas 但是我将如何告诉 Unmarshal 函数将 json 数据解组为哪种类型?我不希望将正常的map[string]interface{} 数据传递给回调函数,然后需要测试回调本身中的每个键和每个类型。
  • 啊,好吧。让我想想然后回来
  • 我能想到的一种方法是让所有类型都实现一个接口类型,而您的函数可以返回该接口。

标签: json go types


【解决方案1】:

好的,经过重新搜索,我认为我想要实现的目标是不可能的,因为需要在编译时知道类型,正如这里提到的那样:

Golang: cast an interface to a typed variable dynamically

但我认为我可以将原始 JSON 字符串传递给侦听器回调,然后在已知数据类型的函数中解组数据。

感谢所有贡献!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2021-04-04
    相关资源
    最近更新 更多