ホームページ > バックエンド開発 > Golang > 文字列表現のカスタムタグ処理を使用して JSON をアンマーシャリングする方法

文字列表現のカスタムタグ処理を使用して JSON をアンマーシャリングする方法

Linda Hamilton
リリース: 2024-10-31 08:37:29
オリジナル
444 人が閲覧しました

How to Unmarshal JSON with Custom Tag Handling for String Representation?

カスタム タグ処理による JSON のアンマーシャリング

JSON を構造体にアンマーシャリングしようとする場合、カスタム タグを持つフィールドを別の方法で処理する必要がある場合があります。 。この記事では、構造体のフィールドに文字列としてアンマーシャリングする必要があることを示すタグが付いている問題について説明します。

問題:

JSON 文字列と対応する構造体:

<code class="json">{
  "I": 3,
  "S": {
    "phone": {
      "sales": "2223334444"
    }
  }
}</code>
ログイン後にコピー
<code class="go">type A struct {
  I int64
  S string `sql:"type:json"`
}</code>
ログイン後にコピー

目的は、「S」フィールドを構造体ではなく文字列としてアンマーシャルすることです。

解決策:

マーシャラー/アンマーシャラー インターフェイスの使用:

Go は、カスタム タイプのマーシャラー インターフェイスとアンマーシャラー インターフェイスを実装することで、デフォルトの JSON マーシャリングおよびアンマーシャリングの動作をオーバーライドする方法を提供します。この場合、RawString という新しい型を作成し、次の関数を実装します。

<code class="go">type RawString string

func (m *RawString) MarshalJSON() ([]byte, error) {
  return []byte(*m), nil
}

func (m *RawString) UnmarshalJSON(data []byte) error {
  if m == nil {
    return errors.New("RawString: UnmarshalJSON on nil pointer")
  }
  *m += RawString(data)
  return nil
}</code>
ログイン後にコピー

構造体への適用:

RawString 型を使用するように A 構造体を変更します。 「S」フィールドの場合:

<code class="go">type A struct {
  I int64
  S RawString `sql:"type:json"`
}</code>
ログイン後にコピー

この実装では、JSON が A 構造体にアンマーシャリングされると、「S」フィールドは文字列としてアンマーシャリングされ、元の JSON 表現が維持されます。

使用例:

<code class="go">const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

func main() {
  a := A{}
  err := json.Unmarshal([]byte(data), &a)
  if err != nil {
    log.Fatal("Unmarshal failed:", err)
  }
  fmt.Println("Done", a)
}</code>
ログイン後にコピー

出力:

<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>
ログイン後にコピー

以上が文字列表現のカスタムタグ処理を使用して JSON をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート