web-dev-qa-db-fra.com

Vérifier si la chaîne est un JSON valide avec jq

Je dois attraper une erreur en levant un service. La réponse peut être null, un message d'erreur tel que

error services-migration/foobar: Not found: services-migration/foobar

ou un JSON valide lorsque tout va bien. Je me demandais s'il était possible avec jq de vérifier simplement si la chaîne fournie est un JSON valide. Je pourrais souvent vérifier la chaîne pour des mots-clés tels que error f.e., mais je cherche une option plus robuste, par exemple. J'ai un true/false ou 1/0 de jq. Je parcourais la documentation de jq ainsi que quelques questions ici sur SO), mais tout était axé sur la recherche et la sélection de valeurs-clés dans un JSON, mais rien sur la validation d'un chaîne.

MISE À JOUR:

J'ai ça:

 result=$(some command)

dont le résultat est la chaîne error services-migration/foobar: Not found: services-migration/foobar

Et puis la déclaration if:

 if jq -e . >/dev/null 2>&1 <<<"$result"; then
    echo "it catches it"
 else
    echo "it doesn't catch it"
 fi

Et cela finit toujours par la clause else.

22
Milkncookiez

Du manuel:

-e/--exit-status:

Définit le statut de sortie de jq sur 0 si les dernières valeurs de sortie n'étaient ni fausses ni nulles, 1 si la dernière valeur de sortie était faux ou nulles ou 4 si aucun résultat valide n'a été produit. Normalement, jq se termine avec 2 en cas de problème d'utilisation ou d'erreur système, 3 en cas d'erreur de compilation du programme jq ou 0 en cas d'exécution du programme jq.

Pour que vous puissiez utiliser:

if jq -e . >/dev/null 2>&1 <<<"$json_string"; then
    echo "Parsed JSON successfully and got something other than false/null"
else
    echo "Failed to parse JSON, or got false/null"
fi

En fait, si vous ne vous souciez pas de distinguer les différents types d’erreur, vous pouvez simplement perdre le -e _ commutateur. Dans ce cas, tout ce qui est considéré comme valide JSON (y compris false/null) sera analysé avec succès par le filtre . et le programme se terminera avec succès, donc la branche if sera suivie.

21
Tom Fenech

Cela fonctionne pour moi

echo $json_string | ./jq -e . >/dev/null 2>&1  | echo ${PIPESTATUS[1]}

qui retourne le code retour:

  • 0 - succès
  • 1 - Échec
  • 4 - invalide

Ensuite, vous pouvez évaluer le code de retour par un code supplémentaire.

9
Reddy SK