我有一个关于在Go中解码任意JSON对象/消息的问题。比如说,你可能会在http连接上接收到三个非常不同的JSON对象(也可以称之为消息),让我们为了举例而称它们为:
{ home : { some unique set of arrays, objects, fields, and arrays objects } }
并且
{ bike : { some unique set of arrays, objects, fields, and arrays objects } }
并且。
{ soda : { some unique set of arrays, objects, fields, and arrays objects } }
我觉得你可以将这些内容从HTTP连接解码成接口的映射,例如:
func httpServerHandler(w http.ResponseWriter, r *http.Request) {
message := make(map[string]interface{})
decoder := json.NewDecoder(r.Body)
_ = decoder.Decode(&message)
然后进行 if、else if 块来寻找有效的 JSON 消息。
if _, ok := message["home"]; ok {
// Decode interface{} to appropriate struct
} else if _, ok := message["bike"]; ok {
// Decode interface{} to appropriate struct
} else {
// Decode interface{} to appropriate struct
}
现在,在 if 块中,如果我重新解码整个 package,我就可以使它正常工作,但我想这有点浪费,因为我已经部分解码了它,只需要解码 map 的值,即一个 interface{},但是我似乎无法正确地做到这一点。
如果我像下面这样做,其中 homeType 是一个结构体,重新编码整个内容就可以工作:
var homeObject homeType
var bikeObject bikeType
var sodaObject sodaType
然后在 if 块中执行以下操作:
if _, ok := message["home"]; ok {
err = json.Unmarshal(r.Body, &homeObject)
if err != nil {
fmt.Println("Bad Response, unable to decode JSON message contents")
os.Exit(1)
}
那么,在不重新解码/取消编组整个内容的情况下,如何使用映射中的 interface{}?