2015-07-19 3 views
8

Я POSTing пользовательский объект JSON для моего приложения Golang, где я декодирую 'req.body' в структуру 'User'.Проверять поле структуры, если оно существует

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

и «User» структура:

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 
} 

В то время как я не нужна помощь с фактической проверки, я хотел бы знать, как проверить имена пользователей, только если она включена как часть Объект JSON. На данный момент, если имя пользователь не включено, то User.Username все еще будет существовать, но быть пустыми, т.е. ""

Как я могу проверить, если «имя пользователя"»был включен в качестве части посланного объекта?

+2

Я не уверен, я понимаю, почему бы не проверить 'если Len (user.username) == 0 {noUsername (); } '? – OneOfOne

+0

Если пользовательский объект размещен без 'username', то' len (user.Username) 'будет по-прежнему равным 0. Я хочу условно проверить - то есть, я хочу проверить имя пользователя, только если оно было включено в объект POST. Извините, если это неясно! – tommyd456

+0

Так что мне нужно иметь возможность различать объект пользователя, чем содержать имя пользователя со значением '' '' (то есть имя пользователя было забыто) и объект User без имени пользователя. – tommyd456

ответ

11

Вы можете использовать указатель на строку:

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

Интересно, я не знал, что это можно сделать так. Я собираюсь протестировать по утрам и помету тогда, если все будет хорошо! – tommyd456

+0

У меня все получилось. Быстрый вопрос - если я хочу проверить длину 'username' после того, как я проверил, нужно ли мне« nil »удалить ссылку? например 'len (* user.Username)' – tommyd456

+1

Да, функция 'len' не может принимать тип' * string' в качестве аргумента. http://golang.org/pkg/builtin/#len – Joey

Смежные вопросы