Go での派生スカラーの UnmarshalJSON 実装
問題:
サブタイプ化された整数定数を変換するカスタム型文字列への変換、または文字列から文字列への変換には自動アンマーシャリングが必要ですJSON 文字列の。 UnmarshalJSON には構造体を使用せずにスカラー値を変更する方法がないため、これは困難です。
解決策:
派生スカラー型に対して UnmarshalJSON を実装するには、次の手順を検討してください。 :
ポインターを使用するレシーバー:
UnmarshalJSON メソッドのポインター レシーバーを使用して、レシーバーの値を変更します。
文字列へのアンマーシャル:
JSON テキストをアンマーシャルして、すべての JSON 引用符を削除したプレーン文字列。
Lookupおよび値の設定:
Lookup 関数を使用して、文字列値に基づいて対応する PersonID を取得します。結果を受信者に割り当てます。
例:
func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil }
コード例:
package main import ( "encoding/json" "fmt" ) type PersonID int const ( Bob PersonID = iota Jane Ralph Nobody = -1 ) var nameMap = map[string]PersonID{ "Bob": Bob, "Jane": Jane, "Ralph": Ralph, "Nobody": Nobody, } var idMap = map[PersonID]string{ Bob: "Bob", Jane: "Jane", Ralph: "Ralph", Nobody: "Nobody", } func (intValue PersonID) Name() string { return idMap[intValue] } func Lookup(name string) PersonID { return nameMap[name] } func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil } type MyType struct { Person PersonID `json: "person"` Count int `json: "count"` Greeting string `json: "greeting"` } func main() { var m MyType if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil { fmt.Println(err) } else { for i := 0; i < m.Count; i++ { fmt.Println(m.Greeting, m.Person.Name()) } } }
出力:
Hello Ralph Hello Ralph Hello Ralph Hello Ralph
以上がGo で派生スカラー型の UnmarshalJSON を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。