我有这个 struct
type SyncInfo struct {
Target string
}
Run Code Online (Sandbox Code Playgroud)
现在我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)
Run Code Online (Sandbox Code Playgroud)
ANi*_*sus 27
如上所述,底层类型json.RawMessage是[]byte,所以你可以使用a json.RawMessage作为数据参数来json.Unmarshal.
但是,您的问题是您有一个指针(*json.RawMessage)而不是值.你所要做的就是取消引用它:
err := json.Unmarshal(*out.Hits.Hits[0].Source, &mySyncInfo)
Run Code Online (Sandbox Code Playgroud)
工作范例:
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)
}
Run Code Online (Sandbox Code Playgroud)
输出:
{Target:localhost}
Run Code Online (Sandbox Code Playgroud)
游乐场: http ://play.golang.org/p/J8R3Qrjrzx
| 归档时间: |
|
| 查看次数: |
27801 次 |
| 最近记录: |