2015-07-19 27 views
8

Sto postando un oggetto utente JSON sulla mia applicazione Golang dove decodifico il 'req.body' in una struttura 'User'.Validate struct field if esiste

err := json.NewDecoder(req.Body).Decode(user) 
//handle err if there is one 

e la struct 'utente':

type User struct { 
    Name  string `json:"name,omitempty"` 
    Username string `json:"username,omitempty"` 
    Email  string `json:"email,omitempty"` 
    Town  string `json:"town,omitempty"` 
    //more fields here 
} 

Mentre io non ho bisogno di aiuto con la convalida effettiva, vorrei sapere come convalidare i nomi utente solo se è incluso come parte del Oggetto JSON. Al momento, se un nome utente non è incluso quindi User.Username esisterà ancora, ma essere vuoto cioè ""

Come posso controllare per vedere se ' 'username'' è stato incluso come parte dell'oggetto postato?

+2

io non sono sicuro di aver capito, perché non 'se len (user.username) == 0 {NOUSERNAME (); } '? – OneOfOne

+0

Se un oggetto utente viene pubblicato senza 'username' allora' len (user.Username) 'sarà uguale a 0. Voglio convalidare condizionatamente - cioè, voglio convalidare il nome utente solo se è stato incluso nell'oggetto POST. Scusa se non è chiaro! – tommyd456

+0

Quindi devo essere in grado di distinguere tra un oggetto utente che contiene un nome utente con valore "" "' (cioè il nome utente è stato dimenticato) e l'oggetto utente senza nome utente. – tommyd456

risposta

11

È possibile utilizzare un puntatore a una stringa:

type User struct { 
    Name  string `json:"name,omitempty"` 
    Username *string `json:"username,omitempty"` 
    Email string `json:"email,omitempty"` 
    Town  string `json:"town,omitempty"` 
    //more fields here 
} 

func main() { 
    var u, u2 User 
    json.Unmarshal([]byte(`{"username":"hi"}`), &u) 
    fmt.Println("username set:", u.Username != nil, *u.Username) 
    json.Unmarshal([]byte(`{}`), &u2) 
    fmt.Println("username set:", u2.Username != nil) 
    fmt.Println("Hello, playground") 
} 

playground

+2

Interessante, non sapevo che si potesse fare in questo modo. Vado a testare la mattina e spunta allora se va tutto bene! – tommyd456

+0

Ho capito. Domanda veloce: se voglio controllare la lunghezza del 'username' dopo aver controllato se è' nil' devo de-fare riferimento a esso? per esempio. 'len (* user.Username)' – tommyd456

+1

sì, la funzione 'len' non può prendere tipo' * stringa' come argomento. http://golang.org/pkg/builtin/#len – Joey