ホームページ >バックエンド開発 >Golang >Go で 1 つの構造体フィールドに複数の JSON タグを使用する方法は?

Go で 1 つの構造体フィールドに複数の JSON タグを使用する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-17 03:25:25416ブラウズ

How to Use Multiple JSON Tags for a Single Struct Field in Go?

構造体フィールドの複数の JSON タグ

サーバーから JSON データを受信し、それを構造体にアンマーシャリングする必要があるシナリオでは、同じデータを異なる JSON タグで表現したい状況が発生する可能性があります。

JSON タグのカスタマイズ

JSON タグは、JSON 表現で使用されるフィールド名を指定します。デフォルトでは、フィールドのタグはフィールド名と同じです。ただし、タグをカスタマイズして、構造体のシリアル化または逆シリアル化時に使用される名前を変更できます。

単一の JSON タグ

単一の JSON タグの使用は簡単です。目的のタグを文字列リテラルとして指定するだけです:

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

複数の JSON タグ

質問で述べたように、複数の JSON タグを直接アタッチすることはできません。単一のフィールド。ただし、この制限を回避できる手法があります。

Struct Casting

指定された解決策では、同じフィールド レイアウトを持つ 2 つの構造体を使用することが提案されています。例:

type Foo struct {
    Name string
    Age  int
}

type Bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}

次に、Foo 構造体を Bar 構造体にキャストして、JSON タグを変更できます。この手法は、多数のフィールドがある場合に特に役立ちます。

foo := Foo{Name: "Sam", Age: 20}
bar := (*Bar)(unsafe.Pointer(&foo))

注意

これを防ぐために、2 番目の構造体をアンエクスポートする必要があることに注意することが重要です。現在のパッケージの外部からアクセスされることを防ぎます。これにより、キャストが意図したとおりにのみ実行され、誤って使用されないことが保証されます。

次のコードは、上記のキャスト手法を示しています。

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Name string
    Age  int
}

type Bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}

func main() {
    foo := Foo{Name: "Sam", Age: 20}
    bar := (*Bar)(unsafe.Pointer(&foo))

    jsonBytes, err := json.Marshal(bar)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(string(jsonBytes))
}

このコードは、Bar 構造体で定義された JSON タグを使用して、Foo 構造体データを正常にシリアル化します。次の JSON 出力が生成されます:

{"employee_name":"Sam"}

以上がGo で 1 つの構造体フィールドに複数の JSON タグを使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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