我有这个 struct
type SyncInfo struct { Target string }
现在我json
从ElasticSearch 查询一些数据.Source
是类型的json.RawMessage
.我想要的只是映射source
到我SyncInfo
为其创建的变量mySyncInfo
.
我甚至想出了如何做到这一点......但这看起来很奇怪.我首先调用MarshalJSON()
get a []byte
然后将json.Unmarshal()
其作为[]byte
一个指向我结构的指针.
这工作正常,但感觉好像我正在做一个额外的跳.我错过了什么,或者是从a json.RawMessage
到a 的预定方式struct
?
var mySyncInfo SyncInfo jsonStr, _ := out.Hits.Hits[0].Source.MarshalJSON() json.Unmarshal(jsonStr, &mySyncInfo) fmt.Print(mySyncInfo.Target)
ANisus.. 27
如上所述,底层类型json.RawMessage
是[]byte
,所以你可以使用a 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}
游乐场: http ://play.golang.org/p/J8R3Qrjrzx
如上所述,底层类型json.RawMessage
是[]byte
,所以你可以使用a 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}
游乐场: http ://play.golang.org/p/J8R3Qrjrzx