json.Unmarshal verschachtelte Objekt in string oder []byte
Ich versuche, Unmarshal einige json, so dass eine verschachtelte Objekt nicht geparst, sondern einfach nur behandelt werden wie ein string
oder []byte
.
So, ich möchte Folgendes erhalten:
{
"id" : 15,
"foo" : { "foo": 123, "bar": "baz" }
}
Deren Marshalling rückgängig gemacht wurde in:
type Bar struct {
Id int64 `json:"id"`
Foo []byte `json:"foo"`
}
Bekomme ich die folgende Fehlermeldung:
json: cannot unmarshal object into Go value of type []uint8
- Warum nicht
map[string]interface{}
? Es hat auch den Vorteil der re-Marshalling der richtige Weg. - dies ist in der Regel nicht empfohlen, da dies ermöglicht es für jede Art, wenn Sie nicht explizit wollen, dass ALLE Typen unterstützt werden, nicht leere Schnittstelle (interface{}), wird es führen, dass Sie mehr Probleme als es löst
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke was du suchst ist die RawMessage geben Sie in der
encoding/json
Paket.Gibt die Dokumentation:
Hier ist ein funktionierendes Beispiel für die Verwendung RawMessage:
Ausgabe:
Spielplatz
Den Typ Foo ist eine map[string]string so definieren, Foo korrekt:
Denke, dass würde besser funktionieren
[]bytes
->Unmarshal
->map[string]interface{}
->Marshal
->string
... warum ?Einen Typ definiert die Implementierung des
Unmarshaler
- Schnittstelle gibt Ihnen Zugang zu den[]byte
's analysiert wird.Spielplatz demo
Nach ein bisschen tüfteln habe ich herausgefunden, dass in Ihren Spielplatz demo, das größte problem ist die Typisierung der json um ein []byte. Um zu sehen, was ich damit meine, nehmen Sie einen Blick auf dieses Spielplatz: http://play.golang.org/p/M0706KCZbh
Wenn Sie es ausführen, werden Sie feststellen, die []byte zwischen den festgelegten Scheibe und die gemarshallt slice unterscheiden sich um den Punkt des Prefs-variable.
json gemarshallt von struct
[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 34 101 121 65 105 90...
festgelegten []byte
[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 123 34 102 111 111 34...
Habe ich entfernt white space, um zu versuchen und machen es zu line-up, so viel wie möglich. Das wichtigste zum mitnehmen ist, dass typecasting nicht produzieren die gleichen Ergebnisse wie laufen die Daten über das json-Format.Marschall-Methode und diese Arbeit zu machen, müssten Sie einen benutzerdefinierten Typ zu behandeln, die unmarshaling von dem, was der json-Paket nicht erkennen.