Проверка привязки не работает, когда телом запроса является массив объекта от golang gin - PullRequest
0 голосов
/ 28 октября 2019

Функция проверки запроса Джина не работает, когда тело запроса (JSON) представляет массив объектов

Пример:

[ 
   { 
      "field1":"aaa",
      "field2":"bbb"
   }
]

код:

type item struct {
    Field1 string `json:"field1" binding:"required"`
    Field2 string `json:"field2" binding:"required"`
}

var items []item

err := c.BindJSON(&items)

Чтобы быть более понятным, логика проверки в gin предполагает, что корневой объект будет структурой, и, следовательно, выдает из строя, когда передается тип массива.

, что является лучшим способом проверки каждого объекта в массиве, переданном втело

1 Ответ

0 голосов
/ 28 октября 2019

JSON будет проанализирован здесь , а затем проверен здесь .

Комментарий к методу ValidateStruct по умолчанию:

ValidateStructполучает любой тип типа, но только выполняет структуру или указатель на тип структуры.

Вы можете обойти это, определив структуру, которая необходима для хранения ваших данных:

type itemHolder struct {
    Items []item
}

Затем определение пользовательского Unmarshaler , например:

func (i *itemHolder) UnmarshalJSON(b []byte) error {
    return json.Unmarshal(b, &i.Items)
}

Теперь *itemHolder реализует json.Unmarshaler, что, в свою очередь, означает, что это будет структура, которая поддерживаетсяby gin.

Этот код должен работать сейчас:

var items itemHolder

err := c.BindJSON(&items)
if err != nil {
    // handle...
}

// use items.Items from here on

Обратите внимание, что ваше поведение маршала изменится;поэтому вам обязательно нужно реализовать интерфейс Marshaler , если вам нужно.

...