请在此处找到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)
}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
jor*_*lli 13
json.RawMessage上的方法都采用指针接收器,这就是为什么你不能利用它们中的任何一个; 你没有指针.
这在它执行的意义上"起作用",但这可能不是你想要的策略:http: //play.golang.org/p/jYvh8nHata
基本上你需要这个:
type Data struct {
Name string
Id int
Json *json.RawMessage
}
Run Code Online (Sandbox Code Playgroud)
然后通过程序的其余部分传播该更改.什么......你究竟想做什么?
jorellis的答案对于1.8之前的Go版本是正确的.
Go 1.8和更新版本将正确处理指针和非指针json.RawMessage的编组.
修复提交:https://github.com/golang/go/commit/1625da24106b610f89ff7a67a11581df95f8e234
| 归档时间: |
|
| 查看次数: |
9957 次 |
| 最近记录: |