Golang/gin анализирует JSON из gin.Context

Из документа gin я узнал, что вы можете привязать json к такой структуре, как

type Login struct {
    User     string `form:"user" json:"user" binding:"required"`
    Password string `form:"password" json:"password" binding:"required"`
}

func main() {
    router := gin.Default()

    // Example for binding JSON ({"user": "manu", "password": "123"})
    router.POST("/loginJSON", func(c *gin.Context) {
        var json Login
        if c.BindJSON(&json) == nil {
            if json.User == "manu" && json.Password == "123" {
                c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
            } else {
                c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
            }
        }
    })
}

Вам всегда нужно создавать структуру для привязки JSON.

Но если есть очень сложные данные JSON, мне нужно только то, что получить их часть, создать сложную структуру — большая нагрузка. Можно ли избежать id и разобрать его напрямую?


person Lucas Liu    schedule 11.08.2017    source источник


Ответы (1)


Вам не нужно создавать структуру для всех полей, присутствующих в ответе JSON, только для тех полей, которые вас интересуют. Любые другие поля, присутствующие в ответе, будут игнорироваться при разупорядочении.

Вы также можете отменить маршалинг к общему map[string]interface{}, но это действительно полезно только для действительно динамических данных. Если вы заранее знаете формат ответа, вам почти всегда будет лучше создать пользовательскую структуру, чтобы обеспечить безопасность типов и избежать постоянных нулевых проверок при доступе к карте. Кроме того, целевая структура позволяет избежать хранения ненужных значений, когда JSON находится в неупорядоченном виде.

Вы можете использовать инструмент JSON to Go, чтобы быстро создать определение структуры из JSON. отклик. Затем вы можете легко удалить все поля, которые вам не нужны.

person Martin Campbell    schedule 11.08.2017
comment
Спасибо за ваше предложение! теперь я читаю данные josn как [] байт из gin.Context.Request.Body. И используйте jsonparser github.com/buger/jsonparser для разбора (лучше, чем encoding/json). Этого достаточно для меня сейчас. - person Lucas Liu; 11.08.2017