wallnutkraken wallnutkraken - 3 months ago 15
JSON Question

json: cannot unmarshal object into Go value of type Auction.Item

I have a problem deserializing my object. I use an interface to this object to call the Serialization, and from reading the output the serialization works perfectly. Here is the underlying struct of my object:

type pimp struct {
Price int
ExpDate int64
BidItem Item
CurrentBid int
PrevBidders []string
}


And here's the interface it implements:

type Pimp interface {
GetStartingPrice() int
GetTimeLeft() int64
GetItem() Item
GetCurrentBid() int
SetCurrentBid(int)
GetPrevBidders() []string
AddBidder(string) error
Serialize() ([]byte, error)
}


The Serialize() method:

func (p *pimp) Serialize() ([]byte, error) {
return json.Marshal(*p)
}


As you may have noticed, pimp has a variable by the name of Item. This item is also, an interface:

type item struct {
Name string
}

type Item interface {
GetName() string
}


Now serializing a sample of such an object returns the following JSON:

{"Price":100,"ExpDate":1472571329,"BidItem":{"Name":"ExampleItem"},"CurrentBid":100,"PrevBidders":[]}


Here is my deserialization code:

func PimpFromJSON(content []byte) (Pimp, error) {
p := new(pimp)
err := json.Unmarshal(content, p)
return p, err
}


Running it, however, gives me the following error:

json: cannot unmarshal object into Go value of type Auction.Item


Any help is appreciated.

Answer

The unmarshaler does not know the concrete type to use for the nil BidItem field. You can fix this by setting the field to a value of the appropriate type:

func PimpFromJSON(content []byte) (Pimp, error) {
    p := new(pimp)
    p.BidItem = &item{}
    err := json.Unmarshal(content, p)
    return p, err
}

playground example

Comments