I'm trying to Unmarshal some json so that a nested object does not get parsed but just treated as a string
or []byte
.
So I want to get the following:
{
"id" : 15,
"foo" : { "foo": 123, "bar": "baz" }
}
Unmarshaled into:
type Bar struct {
Id int64 `json:"id"`
Foo []byte `json:"foo"`
}
I get the following error:
json: cannot unmarshal object into Go value of type []uint8
After a bit of tinkering I've found that in your playground demo the biggest problem is the typecasting of the json to a []byte. To see what I mean by that, take a look a this playground: http://play.golang.org/p/M0706KCZbh
If you run it, you'll notice the []byte between the typecast slice and the marshaled slice differ around the point of the 'Prefs' variable.
json marshaled from struct
[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 34 101 121 65 105 90...
typecast []byte
[123 34 105 100 34 58 49 53 44 34 112 114 101 102 115 34 58 123 34 102 111 111 34...
I've removed white space to try and make it line up as much as possible. The main takeaway from this is that typecasting does not produce the same results as running the data through the json.Marshal method and to make this work you would need a custom type to handle the unmarshaling of what the json package does not recognize.
The Foo type is a map[string]string so define Foo correctly:
Think that would work better
Defining a type which implements the
Unmarshaler
interface gives you access to the[]byte
's being parsed.playground demo
I think what you are looking for is the RawMessage type in the
encoding/json
package.The documentation states:
Here is a working example of using RawMessage:
Output:
Playground