请在此处找到代码http://play.golang.org/p/zdQ14ItNBZ
我将JSON数据保留为RawMessage,但无法将其解码。我需要将包含结构进行编组和解组,但是我希望仍然能够获取JSON字段。
package main import ( "encoding/json" "fmt" ) type Data struct { Name string Id int Json json.RawMessage } type Data2 struct { Name string Id int } func main() { tmp := Data2{"World", 2} b, err := json.Marshal(tmp) if err != nil { fmt.Println("Error %s", err.Error()) } fmt.Println("b %s", string(b)) test := Data{"Hello", 1, b} b2, err := json.Marshal(test) if err != nil { fmt.Println("Error %s", err.Error()) } fmt.Println("b2 %s", string(b2)) var d Data err = json.Unmarshal(b2, &d) if err != nil { fmt.Println("Error %s", err.Error()) } fmt.Println("d.Json %s", string(d.Json)) var tmp2 Data2 err = json.Unmarshal(d.Json, &tmp2) if err != nil { fmt.Println("Error %s", err.Error()) } fmt.Println("Data2 %+v", tmp2) }
b %s {"Name":"World","Id":2} b2 %s {"Name":"Hello","Id":1,"Json":"eyJOYW1lIjoiV29ybGQiLCJJZCI6Mn0="} d.Json %s "eyJOYW1lIjoiV29ybGQiLCJJZCI6Mn0=" Error %s json: cannot unmarshal string into Go value of type main.Data2 Data2 %+v { 0}
json.RawMessage上的方法都带有一个指针接收器,这就是为什么您不能利用它们中的任何一个的原因;您没有指针。
从执行的意义上说,这种“工作”是可行的,但这可能不是您想要的策略:http : //play.golang.org/p/jYvh8nHata
基本上,您需要这样做:
type Data struct { Name string Id int Json *json.RawMessage }
然后将该更改传播到程序的其余部分。什么…您实际上想做什么?