メインコンテンツにスキップ
モジュール 5 · レッスン 4 / 5コース内の 24/50~12 min
モジュールのレッスン (4/5)

フィールドタグとJSON

構造体フィールドの タグ はメタデータ文字列であり、リフレクション経由で読み取られます。 encoding/json、encoding/xml などのライブラリ、バリデータ、ORM によって。彼らは フィールドの型の直後の バッククォート (生の文字列) の間に書き込まれます。

構文

Go
type User struct {
    Name string `json:"nome"`
    Age  int    `json:"eta,omitempty"`
}

形式規則: key:"value" はスペースで区切ります (NOT カンマ) 複数のキーの場合:

Go
type User struct {
    Email string `json:"email" validate:"required,email"`
}

jsonタグ:オプション

最も一般的なオプションは json で、encoding/json によって使用されます。

タグ効果
json:"nome"JSON 出力のフィールドの名前を nome に変更します。
json:"nome,omitempty"フィールドがゼロ値の場合はフィールドを省略します。
json:"-"このフィールドをシリアル化/逆シリアル化しないでください。
json:",omitempty"Go フィールド名を維持しますが、omitempty を使用します。
Go
type User struct {
    Name     string `json:"nome"`
    Age      int    `json:"eta,omitempty"`
    Password string `json:"-"`
}

u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b))   // {"nome":"Ada"}

Age は省略されます (ゼロ値 0 + omitempty)。 Password は 完全に除外されます。

マーシャルとアンマーシャル

Go
// struct -> JSON
b, err := json.Marshal(u)

// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)

Unmarshal はポインタのみを受け入れます。これは、 値のフィールド。

その他の一般的なタグ

  • xml:"..." — encoding/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." — 遊び場/バリデーター
  • form:"..." — ジン / エコー バインディング

ライブラリはリフレクション (reflect.StructTag.Get("json")) を介してそれらを読み取ります。 誰かが解釈するまでは単なる文字列です。

試してみてください

運動#go.m5.l4.e1
試行回数: 0読み込み中…

json:"nome" タグを Name フィールドに追加し、json:"eta" タグを Age フィールドに追加します。

エディターを読み込み中…
ヒントを表示

タグは、フィールド タイプの直後のバッククォートの間にある生の文字列です。

3 回の試行後に解決策が利用可能になります

運動#go.m5.l4.e2
試行回数: 0読み込み中…

Age フィールドにomitempty オプションを追加します。0 の場合は省略する必要があります。

エディターを読み込み中…
ヒントを表示

オプションは名前の後にカンマで区切って指定します: json:"nome,omitempty"。

3 回の試行後に解決策が利用可能になります

Quiz#go.m5.l4.e3
準備完了

json:"nome" と json:"eta" のタグでは何が出力されますか?

Go
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))
回答の選択肢

要約

  • タグはバックティック間の生の文字列です: `key:"value" key2:"value2"`.
  • json:"nome": rename. omitempty__PROTECTED_INLINE_ 28__-: exclude.
  • NON-exported (lowercase) fields are ignored by encoding/json.
  • json.Marshal(v) ↔ json.Unmarshal(data, &v) (pointer).
  • Same mechanism for xml, yaml, db, validate, form, …