2015-07-19 2 views
8

Piszę obiekt użytkownika JSON do mojej aplikacji Golang, w której dekoduję element "req.body" w strukturze "User".Zatwierdź pole struct, jeśli istnieje

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

i „Użytkownik” struct:

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 
} 

Chociaż nie potrzebują pomocy z rzeczywistym walidacji, chciałbym wiedzieć, jak sprawdzić poprawność nazwy użytkownika tylko wtedy, gdy jest włączone jako część Obiekt JSON. W tej chwili, jeśli nazwa użytkownika nie jest wliczone następnie User.Username będzie nadal istnieć, ale być pusta tj ""

Jak mogę sprawdzić, czy „«username»” została włączona jako część Wysłany obiektu?

+2

Nie jestem pewien, czy rozumiem, dlaczego nie sprawdzić 'If Len (user.username) == 0 {NOUSERNAME (); } '? – OneOfOne

+0

Jeśli obiekt użytkownika zostanie opublikowany bez 'nazwa_użytkownika', wtedy' len (nazwa użytkownika.użytkownika) będzie nadal równy 0. Chcę warunkowo sprawdzić poprawność - to znaczy chcę sprawdzić poprawność nazwy użytkownika tylko, jeśli była ona zawarta w obiekcie POST. Przepraszam, jeśli to nie jest jasne! – tommyd456

+0

Potrzebuję więc móc rozróżnić obiekt użytkownika niż zawiera nazwę użytkownika o wartości "" "(np. Zapomniałem nazwy użytkownika) i obiekt użytkownika bez nazwy użytkownika. – tommyd456

Odpowiedz

11

można wykorzystywać wskaźnik do napisu:

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

Ciekawe, nie wiedziałem, że można to zrobić w ten sposób. Rano mam zamiar przetestować i zaznaczę, czy wszystko jest w porządku! – tommyd456

+0

Mam to. Szybkie pytanie - jeśli chcę sprawdzić długość "nazwy użytkownika" po sprawdzeniu, czy jest "nil", czy muszę go odrzucić? na przykład 'len (* user.Username)' – tommyd456

+1

yes, funkcja 'len' nie może przyjąć typu' * string' jako argumentu. http://golang.org/pkg/builtin/#len – Joey