Go では、埋め込みフィールドを含む構造体に JSON データをアンマーシャリングするときに、埋め込み構造体がその構造体を定義している場合に問題が発生する可能性があります。独自の UnmarshalJSON メソッド。これは、JSON ライブラリが埋め込み構造体の UnmarshalJSON を呼び出し、含まれる構造体で定義されたフィールドを無視するためです。
次の構造体の定義を考えてみましょう:
type Outer struct {
Inner
Num int
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
json.Unmarshal(data, &Outer{}) を使用して JSON を Outer にアンマーシャリングすると、Inner フィールドは UnmarshalJSON メソッドをトリガーし、JSON 文字列全体を消費します。これにより、Outer の Num フィールドが無視されます。
この問題を解決するには、埋め込み構造体 Inner を、Outer:
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
Inner を明示的なフィールドにすることで、JSON ライブラリがデータを Num フィールドなどの Outer の適切なフィールドにアンマーシャリングするようになります。
import (
"encoding/json"
"fmt"
)
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
func main() {
data := []byte(`{"Data": "Example", "Num": 42}`)
var outer Outer
err := json.Unmarshal(data, &outer)
if err != nil {
fmt.Println(err)
}
fmt.Println(outer.I.Data, outer.Num) // Output: Example 42
}
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3