web-dev-qa-db-fra.com

Un moyen facile de vérifier que la chaîne est au format JSON dans Golang?

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!")
   }
}
17
A-letubby

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
17
Cory LaNou

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
}
31
William King

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
6
peterSO

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 .

1
valyala

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.

1
Adi Sivasankaran

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!")
}
0
ymg

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.

0
tatertot