Golang将通用JSON对象解码为多种格式之一
发布时间:2020-12-16 09:28:33 所属栏目:大数据 来源:网络整理
导读:我正在研究golang中基于 JSON的通用消息传递协议.我想要做的是拥有一个BaseMessage,它具有类型,时间戳等一般信息.但同时我希望能够为某些类型的数据定义更具体的消息结构. 例如: type Message struct { Type string `json:type` Timestamp string `json:tim
我正在研究golang中基于
JSON的通用消息传递协议.我想要做的是拥有一个BaseMessage,它具有类型,时间戳等一般信息.但同时我希望能够为某些类型的数据定义更具体的消息结构.
例如: type Message struct { Type string `json:type` Timestamp string `json:timestamp` } type EventMessage struct { Message EventType string EventCreator string EventData interface{} } 我有一组处理程序,并确定哪个处理程序应该处理消息我首先将JSON解码为常规消息类型以检查类型字段.对于此示例,我将获得与“事件”消息类型相关联的处理程序. 当我想要将EventMessage类型断言到结构上时,我遇到了问题. 下面的代码非常粗糙,但希望它显示了我如何处理消息的一般概念. type Handler func(msg Message) Message handlers := make(map[string]Handler) var msg Message decoder.Decode(&msg) handler := handlers[msg.Type] handler(msg) 我曾尝试使用接口{}但是JSON解码器只是创建了一个地图,然后我无法断言任何一个类型.我已经找到了可行的解决方法,但它非常难看,可能效率不高,而且很可能容易出错.我想保持简单明了的事情,这样就可以轻松维护这些代码. 是否有一种在Golang中处理通用JSON对象的方法,以便解码的JSON可以是许多结构格式之一? 我还想到在主Message结构中的Data接口{}中有更多特定信息的想法,但后来我遇到了无法在接口上断言任何类型的相同问题.必须有一种更好的方法来处理我刚才缺少的JSON格式. 解决方法
处理此问题的一种方法是使用
json.RawMessage字段为消息的固定部分定义结构,以捕获消息的变体部分.将json.RawMessage解码为特定于变体的类型:
type Message struct { Type string `json:type` Timestamp string `json:timestamp` Data json.RawMessage } type Event struct { Type string `json:type` Creator string `json:creator` } var m Message if err := json.Unmarshal(data,&m); err != nil { log.Fatal(err) } switch m.Type { case "event": var e Event if err := json.Unmarshal([]byte(m.Data),&e); err != nil { log.Fatal(err) } fmt.Println(m.Type,e.Type,e.Creator) default: log.Fatal("bad message type") } playground example (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |