使用类型查找映射解组通用json

时间:2016-02-05 02:02:19

标签: go

我正在跟踪Golang Decoding Generic JSON Objects to One of Many Formats作为解组通用json的方法。我将有许多不同类型的东西,可以由其他人添加,因此硬编码的案例陈述是不可行的。

我也不想将类型硬编码为字符串,但是让那些使用库的人选择“查找”名称,以防他们想要稍后重命名它们的基础结构。

我基本上是在找这样的东西:

type myInterface interface {
  Something() // irrelevant, just to show you It's not about interface{}
}

type myBar struct {}       // fulfils myInterface
type mySomething struct {} // fulfils myInterface

var types = make(map[string]type) // <--- Obvious Pseudo code ;)
types["foo:bar"] = myBar       // done by whoever uses the library
types["1230988"] = mySomething // ...

type storageWrapper struct {
  Type string
  Data json.RawMessage
}

func loadSomething(id string) myInterface {
  buf := db.load(id) // pseudo code but you get the idea
  sw := &storageWrapper{}
  json.Unmarshal(buf, sw)

  // now the interesting part
  targetType := types[sw.Type]
  thing := &targetType{}
  json.Unmarshal(sw.Data, thing)
  return thing
}

我有这种感觉,我正在思考整个问题。或者说我试图将Go转变成与其基本哲学相冲突的东西。我非常开放并感谢任何建议对整个问题提出不同方法的建议

1 个答案:

答案 0 :(得分:0)

types成为map[string]myInterface,并且要注册类型,让调用者将该类型的空值(不是引用)存储到地图中。然后,为了解组,你可以得到类型&#34;通过将空值复制出地图,解组并返回它(或对它的引用)。界面值将完成识别所需类型的工作。另外,如果用户想要将某些字段默认为非零/空值,以防它们未在JSON中提供,他们实际上可以通过将这些值存储在类型映射中的结构中来实现。