2017-11-13 9 views
2

ユーザー構造体にパスワードフィールドがあるとします。整列化しないで整列化しないときにGolangがJsonフィールドを無視する

type User struct{ 
    UserName string `json:"username"` 
    Password string `json:"-"` 
} 

私のクライアントは、ユーザー名とパスワードを一緒に投稿してユーザーを登録します。したがって、上記の構造体にJSONをデコードすると、パスワードは無視されます。それは期待される。しかし、私はマーシャルだけの場面ではフィールドを無視する方法があるのだろうと思った。私は公式のドキュメンテーションのページに行きましたが何も見つけることができませんでした。

https://golang.org/pkg/encoding/json/

私は、構造体の中に余分なフィールドを追加することができますが、私が最初に知っておく必要があり、それはそれでJSONのlibが行うことが可能です。

+1

2つのマッピングを持つ2つの構造体を作成エンコードとデコードのため – Vardius

+0

まず、jsonの表記法を使ってこれを行う方法がないことを知る必要があります。 – RockOnGom

答えて

2

一つの一般的なアプローチは同じ構造で、一時的な型や変数を使用することであるが、異なるjsonタグ、あるいは異なる構造:

type User struct { 
    UserName string `json:"username"` 
    Password string `json:"password"` 
} 

func (usr User) MarshalJSON() ([]byte, error) { 
    var tmp struct { 
     UserName string `json:"username"` 
    } 
    tmp.UserName = usr.UserName 
    return json.Marshal(&tmp) 
} 
1

Goのカスタムマーシャリング/アンマーシャリング要件と同様に、json.Marshaler/json.Unmarshalerインターフェイスをカスタムタイプで実装することを検討するのが最善の方法です。この場合

、あなたがパスワードフィールドのためにそれを行うことができますしてます。structができるようになりますjson.Unmarshalerを実施しないことで、タイプpasswordは、その基になる型(string)のデフォルトの動作を保持することを

// Use an explicit password type. 
type password string 

type User struct{ 
    UserName string `json:"username"` 
    Password password `json:"password"` 
} 

// Marshaler ignores the field value completely. 
func (password) MarshalJSON() ([]byte, error) { 
    return []byte(`""`), nil 
} 

注意、 Passwordの値でアンマーシャリングされます。

の作業例:https://play.golang.org/p/HZQoCKm0vN

関連する問題