Например, у меня есть следующее struct
type Address struct {
City string `json:"city" binding:"required"`
AddressLine string `json:"address_line" binding:"required"`
}
и у меня есть следующая функция для обработки запроса от пользователей
func AddressCreate(c *gin.Context) {
var address Address
if err := c.BindJSON(&address); err == nil {
// if everything is good save to database
// and return success message
db.Create(&address)
c.JSON(http.StatusOK, gin.H {"status":"success"})
} else {
c.JSON(http.StatusBadRequest, err)
}
}
Ожидаемое поведение - возвратjson отформатировал таким образом
[
{
"city":"required"
}
{
"address_line":"required"
}
]
Но я получаю ошибку, отформатированную следующим образом
"Address.City": {
"FieldNamespace": "Address.City",
"NameNamespace": "City",
"Field": "City",
"Name": "City",
"Tag": "required",
"ActualTag": "required",
"Kind": 24,
"Type": {},
"Param": "",
"Value": ""
},
"Address.AddressLine": {
"FieldNamespace": "AddressLine",
"NameNamespace": "AddressLine",
"Field": "AddressLine",
"Name": "AddressLine",
"Tag": "required",
"ActualTag": "required",
"Kind": 24,
"Type": {},
"Param": "",
"Value": ""
}
Что я пробовал:
Я создал функцию, которая приводит error
к ValidationErrors
и перебирает все FieldError
в нем
func ListOfErrors(e error) []map[string]string {
ve := e.(validator.ValidationErrors)
InvalidFields := make([]map[string]string, 0)
for _, e := range ve {
errors := map[string]string{}
// field := reflect.TypeOf(e.NameNamespace)
errors[e.Name] = e.Tag
InvalidFields = append(InvalidFields, errors)
}
return InvalidFields
}
Вывод выглядит намного лучше
[
{
"City":"required"
},
{
"AddressLine":"required"
}
]
Но я не могу решить проблему с именем полей.Я не могу поменять Name
на name
, что я отметил в теге structs json:"city"
.Поэтому мой вопрос: правильно ли я выбрал способ решения проблемы, если ответ «да», как получить структуры json tag для поля?