構造体フィールドの複数の 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 サイトの他の関連記事を参照してください。