3 回答
TA贡献1775条经验 获得超11个赞
看起来我可以用一个名为 mapstructure 的库来解决这个问题。
var cart Cartoon
mapstructure.Decode(message.Entity, &cart)
fmt.Println("cartoon:", cart)
我在这里做了一个成功的测试:https: //play.golang.org/p/J9V-SFz1pJE
TA贡献1871条经验 获得超13个赞
问题询问如何将一个转换interface{}为 Go 类型。OPs 应用程序中更高级别的目标是将 JSON 消息的变体部分转换为 Go 类型。这里回答了更高层次的问题。
如果在解组 JSON 时类型已知,则将 Entity 字段设置为指向适当类型值的指针:
var cart Cartoon
message := &Message{Entity: &cart}
err := json.Unmarshal(payload, message)
在操场上运行它。
如果在解码消息的不变部分之后才知道类型,则使用json.RawMessage捕获实体 JSON。一旦知道类型,就解码该 JSON。
var entity json.RawMessage
message := &Message{Entity: &entity}
err := json.Unmarshal(payload, &message)
// ... determine target entity type using message
var cart Cartoon
err = json.Unmarshal(entity, &cart)
在操场上跑
另一种选择是创建类型注册表:
var messageTypes = map[string]reflect.Type{
"cartoon": reflect.TypeOf(&Cartoon{}).Elem(),
}
并从注册表中解码为一种类型:
var entity json.RawMessage
message := &Message{Entity: &entity}
err = json.Unmarshal(payload, message)
if err != nil {
// handle error
}
message.Entity = nil
if t := messageTypes[message.Type]; t != nil {
v := reflect.New(t).Interface()
err := json.Unmarshal(entity, v)
if err != nil {
// handle error
}
message.Entity = v
}
TA贡献1828条经验 获得超6个赞
有一个解决方案(它不是那么优雅!),如果你保持结构不变。
tmp, ok := message.Entity.(map[string]interface{})
if ok {
cart.Name = tmp["Name"].(string) // inside bracket depends to the json
cart.Show = tmp["Show"].(string)
}
https://play.golang.org/p/T9i7pYlk96h
你也可以使用反射。
- 3 回答
- 0 关注
- 271 浏览
添加回答
举报