Marschall von json.RawMessage
Bitte den code finden hier http://play.golang.org/p/zdQ14ItNBZ
Führe ich JSON-Daten als RawMessage, kann aber nicht entschlüsseln aus. Ich brauche den mit struct zu Gemarshallt werden und Unmarshallt, aber ich würde erwarten, dass noch in der Lage sein, um die JSON-Feld.
code:
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)
}
aus:
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}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Methoden auf json.RawMessage alle ein-Zeiger-Empfänger, das ist, warum Sie nicht in der Lage zu nutzen, alle von Ihnen; Sie haben keine Zeiger.
Diese "Werke" in dem Sinne, dass es ausgeführt wird, aber das ist wahrscheinlich nicht die Strategie, die Sie wollen: http://play.golang.org/p/jYvh8nHata
im Grunde brauchen Sie diese:
und dann zu propagieren, dass die änderung durch den rest des Programms. Was... was bist du eigentlich machen willst?
jorellis Antwort ist korrekt für Versionen vor 1.8.
Gehen 1,8 und neuere korrekt behandelt marshalling von beiden einen Zeiger und nicht-Zeiger json.RawMessage.
Befestigung Begehen: https://github.com/golang/go/commit/1625da24106b610f89ff7a67a11581df95f8e234