Je veux créer une fonction pour recevoir une chaîne d'entrée qui peut être une chaîne au format JSON ou simplement une chaîne. Par exemple, quelque chose de facile comme fonction suivante.
func checkJson(input string){
if ... input is in json ... {
fmt.Println("it's json!")
} else {
fmt.Println("it's normal string!")
}
}
Je ne savais pas si vous deviez connaître la "chaîne entre guillemets", ou si vous deviez connaître Json, ou la différence entre les deux, ce qui vous montre comment détecter les deux scénarios afin que vous puissiez être très spécifique.
J'ai également posté ici l'exemple de code interactif: http://play.golang.org/p/VmT0BVBJZ7
package main
import (
"encoding/json"
"fmt"
)
func isJSONString(s string) bool {
var js string
return json.Unmarshal([]byte(s), &js) == nil
}
func isJSON(s string) bool {
var js map[string]interface{}
return json.Unmarshal([]byte(s), &js) == nil
}
func main() {
var tests = []string{
`"Platypus"`,
`Platypus`,
`{"id":"1"}`,
}
for _, t := range tests {
fmt.Printf("isJSONString(%s) = %v\n", t, isJSONString(t))
fmt.Printf("isJSON(%s) = %v\n\n", t, isJSON(t))
}
}
Ce qui produira ceci:
isJSONString("Platypus") = true
isJSON("Platypus") = false
isJSONString(Platypus) = false
isJSON(Platypus) = false
isJSONString({"id":"1"}) = false
isJSON({"id":"1"}) = true
Si vous recherchez un moyen de valider une chaîne JSON indépendamment du schéma, essayez les solutions suivantes:
func IsJSON(str string) bool {
var js json.RawMessage
return json.Unmarshal([]byte(str), &js) == nil
}
Par exemple,
package main
import (
"encoding/json"
"fmt"
)
func isJSONString(s string) bool {
var js string
err := json.Unmarshal([]byte(s), &js)
return err == nil
}
func main() {
fmt.Println(isJSONString(`"Platypus"`))
fmt.Println(isJSONString(`Platypus`))
}
Sortie:
true
false
La bibliothèque standard encoding/json
contient json.Valid function à partir de go 1.9 - voir https://github.com/golang/go/issues/18086 . Cette fonction peut être utilisée pour vérifier si la chaîne fournie est un json valide:
if json.Valid(input) {
// input contains valid json
}
Mais json.Valid
peut être assez lent par rapport aux solutions tierces telles que fastjson.Validate , qui est jusqu'à 5 fois plus rapide que le json.Valid
standard - voir la section json validation
dans benchmarks .
La réponse actuellement acceptée (à compter de juillet 2017) échoue pour les baies JSON et n'a pas été mise à jour: https://repl.it/J8H0/10
Essaye ça:
func isJSON(s string) bool {
var js interface{}
return json.Unmarshal([]byte(s), &js) == nil
}
Ou la solution de William King, qui est meilleure.
que diriez-vous d'utiliser quelque chose comme ceci:
if err := json.Unmarshal(input, temp_object); err != nil {
fmt.Println("it's normal string!")
} else {
fmt.Println("it's json!")
}
En cherchant une réponse à cette question, j'ai trouvé https://github.com/asaskevich/govalidator , qui était liée à cet article de blog qui décrit la création d'un validateur d'entrée: https: //husobee.github .io/golang/validation/2016/01/08/input-validation.html . Juste au cas où quelqu'un chercherait une bibliothèque rapide pour le faire, j'ai pensé qu'il serait utile de placer cet outil dans un endroit facile à trouver.
Ce paquet utilise la même méthode pour isJSON que celle suggérée par William King, comme suit:
// IsJSON check if the string is valid JSON (note: uses json.Unmarshal).
func IsJSON(str string) bool {
var js json.RawMessage
return json.Unmarshal([]byte(str), &js) == nil
}
Ce paquet m'a permis de mieux comprendre JSON, alors il m'a semblé utile de le mettre ici.