モジュール 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/xmlyaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."— 遊び場/バリデーター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, …