我有struct
type SyncInfo struct {
Target string
}
现在我从ElasticSearch查询一些json
数据。 Source
的类型为json.RawMessage
。
我想要的只是将source
映射到我为其创建变量SyncInfo
的{{1}}。
我甚至想出了怎么做......但这看起来很奇怪。我首先致电mySyncInfo
获取MarshalJSON()
,然后将其提供给[]byte
,其中json.Unmarshal()
和指向我的结构的指针。
这种方法很好但感觉好像我正在做一个额外的跳跃。我错过了某些内容,或者是从[]byte
转到json.RawMessage
的预期方式吗?
struct
答案 0 :(得分:20)
如上所述,json.RawMessage
的基础类型为[]byte
,因此可以使用json.RawMessage
作为json.Unmarshal
的数据参数。
但是,您的问题是您有一个指针(*json.RawMessage
)而不是值。您所要做的就是取消引用它:
err := json.Unmarshal(*out.Hits.Hits[0].Source, &mySyncInfo)
工作示例:
package main
import (
"encoding/json"
"fmt"
)
type SyncInfo struct {
Target string
}
func main() {
data := []byte(`{"target": "localhost"}`)
Source := (*json.RawMessage)(&data)
var mySyncInfo SyncInfo
// Notice the dereferencing asterisk *
err := json.Unmarshal(*Source, &mySyncInfo)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", mySyncInfo)
}
<强>输出:强>
{Target:localhost}
答案 1 :(得分:3)
json.RawMessage
实际上只是一小块字节。您应该可以直接将其直接输入json.Unmarshal
,如下所示:
json.Unmarshal(out.Hits.Hits[0].Source, &mySyncInfo)
此外,有些不相关,但json.Unmarshal
可以返回错误,您想要处理它。
err := json.Unmarshal(*out.Hits.Hits[0].Source, &mySyncInfo)
if err != nil {
// Handle
}