带有未编组数据的类型断言
在分布式系统中,数据通常作为 JSON 字符串进行交换。从消息队列中检索 JSON 数据时,您可能会遇到需要将数据反序列化为 Interface{},然后执行类型断言以确定数据实际结构类型的场景。
问题
将接收到的 JSON 字符串解组到接口{}并尝试输入断言结果时,您可能会遇到意外结果。您获得的不是预期的结构类型,而是映射[字符串]接口{}。
解决方案
JSON 解组到接口{} 的默认行为会产生类型例如 bool、float64、string、[]interface{} 和 map[string]interface{}。由于 Something1 和 Something2 是自定义结构,因此 JSON 解组器无法识别它们。
要解决此问题,有两种主要方法:
1。直接解组到自定义结构
代码:
var input Something1 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here var input Something2 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here
2.从地图界面解压
代码:
var input interface{} json.Unmarshal([]byte(msg), &input) // Unpack the data from the map switch v := input.(type) { case map[string]interface{}: // Extract the data from the map and assign it to custom structs }
高级方法
要获得更通用的解决方案,考虑创建一个“Unpacker”结构来处理解组和类型断言
代码:
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
结论
通过使用其中一种方法,您可以成功执行 type对首先从 JSON 字符串解组到接口{}的数据的断言。方法的选择取决于您应用程序的具体要求。
以上是如何在 Go 中对未编组的 JSON 数据执行类型断言?的详细内容。更多信息请关注PHP中文网其他相关文章!