ホームページ >バックエンド開発 >Golang >Go で派生スカラー型の UnmarshalJSON を実装するにはどうすればよいですか?

Go で派生スカラー型の UnmarshalJSON を実装するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-26 18:41:16412ブラウズ

How to Implement UnmarshalJSON for Derived Scalar Types in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。