2016-08-30 10 views
2

オブジェクトを直列化解除する際に問題が発生しました。このオブジェクトへのインターフェイスを使用してシリアル化を呼び出すと、シリアル化が完璧に動作する出力を読み取ることができます。ここに私のオブジェクトの基礎となる構造体である:json:オブジェクトをAuction.Item型のGo値に非整列化できません

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

は、ここには実装インタフェースです:

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

のSerialize()メソッド:あなたは気づいているかもしれませんが

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

、ポン引きItemの名前で変数があります。

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

それを実行している:ここで

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

が私のデシリアライゼーションコードです:今、そのようなオブジェクトのサンプルをシリアライズ

type item struct { 
    Name string 
} 

type Item interface { 
    GetName() string 
} 

には、以下のJSONを返します。このアイテムは、また、インターフェースですただし、次のエラーが表示されます。

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

ご迷惑をおかけして申し訳ございません。

+3

JSONパッケージは、具体的なタイプを使用するかを知る方法がないので、あなたは、空のインターフェイスに非整列化することはできませんそのインタフェースの内部にある。 – JimB

+0

どのようなタイプであるかを知る方法はありますか? ['json:" varName "'](https://golang.org/pkg/encoding/json/#Marshal)のようなもの? – wallnutkraken

+0

いいえ、型を名前で参照することはできません(型を直接使用しない場合、コンパイルされたバイナリにも型がない可能性があります)。インターフェイスに非整列化しないようにしてください(jsonパッケージのデフォルトの型に 'interface {}'を使う以外)。 – JimB

答えて

4

unmarshalerは、Nil BidItemフィールドに使用する具体的なタイプを認識していません。あなたは適切な型の値にフィールドを設定することで、この問題を解決することができます

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

playground example

+0

ありがとう!それは私のために働いた! – wallnutkraken

関連する問題