4
votes

Comment valider l'entrée JSON dans Go

J'utilise le framework Beego pour créer une application Web dans Go. Je dois valider le JSON entrant dans une demande d'API.

Je peux démarseler le JSON dans une structure qui fonctionne bien, mais je souhaite également valider les données. Par exemple, si le type ne correspond pas au type dans la structure json, Unmarshal renverra une erreur à la première occurrence. Je veux valider et obtenir toutes les erreurs à la fois pour JSON.

J'ai essayé https://github.com/thedevsaddam/govalidator mais le package a besoin d'une référence pour demander un objet qui n'est pas disponible dans le contrôleur de Beego. Il existe d'autres validateurs qui peuvent valider un struct mais je veux également la validation json.

ÉDITER:

Une référence à l'objet de requête dans beego peut être trouvée à partir de l'objet de contexte du contrôleur sous la forme:

func (this *MainController) Post() {
    fmt.Println(this.Ctx.Request)
}

Mais le problème reste le même avec json unmarshal. S'il y a une légère discordance dans le type, json.unmarshal paniquera immédiatement. Je souhaite également pouvoir valider le type.


3 commentaires

Ce n'est pas pris en charge par la bibliothèque standard, il semble donc que vous demandez une bibliothèque tierce? C'est hors sujet pour SO.


Une bibliothèque tierce ou toute solution est la bienvenue.


json.Decoder.Token() pourrait aider, mais cela nécessitera un peu de code.


4 Réponses :


4
votes

Nous avons utilisé go-terrain de jeu / validator.v8 dans un but similaire. Vous pouvez définir les validations de données avec les balises qui sortent de la boîte (trucs de base comme l'égalité, min / max et a même quelque chose d'une expression lang). En plus de cela, vous pouvez ajouter vos validations personnalisées. Tout est dans la documentation, j'espère que cela vous aidera.


0 commentaires

0
votes

Il existe une méthode checkValid (dans le package encoding/json ) qui peut le faire. Cette méthode, cependant, n'est pas exposée. Ainsi, vous pouvez utiliser Unmarshal (dans le même package) pour vérifier si JSON est valide.


0 commentaires

0
votes

Je devais le faire aujourd'hui donc je vais partager ma solution. J'ai créé une fonction en utilisant unmarshal qui renvoie vrai ou faux selon que le texte renvoie un json valide:

// isJSON checks that the string value of the field can unmarshall into valid json
func isJSON(fl validator.FieldLevel) bool {
    var j map[string]interface{}
    if err := json.Unmarshal([]byte(fl.Field().String()), &j); err != nil {
        return false
    }
    return true
}

// register the function with json tag:
validate.RegisterValidation("json", isJSON)

Ensuite, j'ai utilisé cette logique avec le package de validation pour créer et enregistrer une balise de validation personnalisée que je peux utiliser dans n'importe quelle structure pour valider qu'un champ contient json. Vous pouvez utiliser go Playground pour vérifier la solution complète et expérimenter:

// isJSON checks that the string value of the field can unmarshall into valid json
func isJSON(s string) bool {
    var j map[string]interface{}
    if err := json.Unmarshal([]byte(s), &j); err != nil {
        return false
    }
    return true
}


0 commentaires

1
votes

Depuis Golang v1.9 json.Valid([]byte) est une méthode valide disponible à partir du package "encoding / json".

Référence: https://golang.org/pkg/encoding/json/#Valid


0 commentaires