2016-08-16 19 views
2

json.Unmarshal(data, &Outer{})を使用してJSONアンマーシャリング埋込み構造体

type Outer struct { 
    Inner 
    Num int 
} 

type Inner struct { 
    Data string 
} 
func (i *Inner) UnmarshalJSON(data []byte) error { 
    i.Data = string(data) 
    return nil 
} 

InnerUnmarshalJSONを使用しているようだとNumフィールドを無視します:https://play.golang.org/p/WUBfzpheMl

私は扱いにくいを持っていますsolution私はNumフィールドを手作業で設定しましたが、誰かがよりクリーンで簡単な方法を持っていたかどうかは疑問でした。

ありがとうございます!

答えて

2

より完全な例です。つまり、jsonライブラリがunmarshalerをOuterに呼び出すと、代わりにInnerにそれを呼び出すことになります。

したがって、func (i *Inner) UnmarshalJSON(data []byte)の中には、data引数には、json文字列全体が含まれています。この文字列は、Innerのためだけに処理されます。

あなたはInnerがインライン化されているので、それがOuterのマーシャリング解除に使われているので、ちょうどあなたの例ではUnmarshalJSONを削除Outer

Outer struct { 
    I Inner // make Inner an explicit field 
    Num int `json:"Num"` 
} 

Working example

+0

説明をありがとう! – tochiai

0

Inner明示的なフィールドを作ることによってこの問題を解決することができます。それ以外の場合は、何かカスタムをしたい場合は、それを上書きする必要があります。

https://play.golang.org/p/D6V6vKpx9J

関連する問題