【发布时间】:2015-04-01 20:23:10
【问题描述】:
我有一个对象列表(确切地说是olievere/Elastic SearchResult.Hits)。其中每一个都有一个json.RawMessage 对象,我正在寻找一个可抽象的方法,该方法接受任何结构的接口切片,Unmarshal 的每个人都将json.RawMessage 命中到所述结构中,并将其附加到传入的@987654324 @。
这个 func 不应该对所需的业务层结构有任何逻辑或洞察力,并且 DB Call 的接口非常繁重,因此对上述 Elastic 包没有可见性。我试图做的例子......
foo.go
import (bar, package)
type TestStruct struct {
Slice []*package.Struct // package.Struct has a value of Source which is a
// json.RawMessage
}
func GetData() bar.Test {
return &TestStruct{*package.GetData()}
}
func (result TestStruct) UnmarshalStruct(v []interface{}) {
for _, singleStruct := range result.Slice {
append(json.Unmarshal(singleStruct, &v))
}
第二个文件
bar.go
type Handler interface {
GetData() Test
}
type Test interface {
UnmarshalStruct
}
type OtherType struct {
foo string
bar string
}
func RetrieveData() []OtherType {
handler := New(Handler)
test := handler.GetData()
var typeSlice []OtherType
test.UnmarshalStruct(&typeSlice)
}
我希望将 []OtherType 类型的东西或我决定创建的任何其他新结构交给UnmarshalStruct,然后让它返回给我同样的结构,只是充满了数据强>
例如,我将要从 Elastic 中搜索两种不同类型的数据。我将收到以下两个对象之一的列表。
{ 'foo': '',
'id':
}
在不同的索引中
{ 'bar': '',
'baz': '',
'eee': ''
}
每一个都自然需要两个不同的结构。
但是,我希望有一种方法能够解码这些列表中的任何一个。我将在下面给出,并且使用相同的函数我希望能够将其转换为 bar 结构,并将其他类型转换为 foo 结构。
{ 'source': [
{ 'bar': '',
'baz': '',
'eee': ''
},
{ 'bar': '',
'baz': '',
'eee': ''
},
{ 'bar': '',
'baz': '',
'eee': ''
}
]
}
【问题讨论】:
-
我没有看到任何问题。您是否有问题:golang.org/doc/faq#convert_slice_of_interface?
-
是的,请详细说明您遇到的问题。
-
以粗体更新。我希望将 []OtherType 类型的东西或我决定创建的任何其他新结构交给 UnmarshalStruct,然后让它返回给我同样的结构,只是充满了数据
-
已发布 json,但问题变得非常复杂,因为我觉得我在重复同样的事情。简单地说,我想要一个通用 func,我给一个实例化结构的接口切片(我们称之为 A)。然后它将填充 A,我可以从原始调用函数返回 A。
-
所以问题是:给定一个异构 json 对象列表,我可以编写什么函数来神奇地将每个 json 对象解组为正确的结构类型,而无需事先告诉函数预期哪些结构类型?跨度>
标签: go