请在这里找到代码
http://play.golang.org/p/zdQ14ItNBZ
我将JSON数据保留为RawMessage,但无法将其解码.我需要包含结构的Marshalled和Unmarshalled,但我希望仍能获得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
- }
然后通过程序的其余部分传播该更改.什么……你究竟想做什么?