オブジェクトを直列化解除する際に問題が発生しました。このオブジェクトへのインターフェイスを使用してシリアル化を呼び出すと、シリアル化が完璧に動作する出力を読み取ることができます。ここに私のオブジェクトの基礎となる構造体である: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
ご迷惑をおかけして申し訳ございません。
JSONパッケージは、具体的なタイプを使用するかを知る方法がないので、あなたは、空のインターフェイスに非整列化することはできませんそのインタフェースの内部にある。 – JimB
どのようなタイプであるかを知る方法はありますか? ['json:" varName "'](https://golang.org/pkg/encoding/json/#Marshal)のようなもの? – wallnutkraken
いいえ、型を名前で参照することはできません(型を直接使用しない場合、コンパイルされたバイナリにも型がない可能性があります)。インターフェイスに非整列化しないようにしてください(jsonパッケージのデフォルトの型に 'interface {}'を使う以外)。 – JimB