Réponse à la question
La fonction json_last_error
renvoie la dernière erreur survenue lors de l'encodage et du décodage JSON. Ainsi, la manière la plus rapide de vérifier le JSON valide est
// décoder les données JSON
// définir le deuxième paramètre booléen TRUE pour une sortie de tableau associatif.
$result = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
// JSON est valide
}
// OU c'est équivalent
if (json_last_error() === 0) {
// JSON est valide
}
Notez que json_last_error
est supporté uniquement dans PHP >= 5.3.0.
Programme complet pour vérifier l'ERREUR exacte
Il est toujours bon de connaître l'erreur exacte pendant le développement. Voici un programme complet pour vérifier l'erreur exacte basé sur la documentation PHP.
function json_validate($string)
{
// décoder les données JSON
$result = json_decode($string);
// switch et vérifier les erreurs JSON possibles
switch (json_last_error()) {
case JSON_ERROR_NONE:
$error = ''; // JSON est valide // Aucune erreur ne s'est produite
break;
case JSON_ERROR_DEPTH:
$error = 'La profondeur maximale de la pile a été dépassée.';
break;
case JSON_ERROR_STATE_MISMATCH:
$error = 'JSON invalide ou malformé.';
break;
case JSON_ERROR_CTRL_CHAR:
$error = 'Erreur de caractère de contrôle, peut-être encodé de manière incorrecte.';
break;
case JSON_ERROR_SYNTAX:
$error = 'Erreur de syntaxe, JSON malformé.';
break;
// PHP >= 5.3.3
case JSON_ERROR_UTF8:
$error = 'Caractères UTF-8 mal formés, peut-être encodés de manière incorrecte.';
break;
// PHP >= 5.5.0
case JSON_ERROR_RECURSION:
$error = 'Une ou plusieurs références récursives dans la valeur à encoder.';
break;
// PHP >= 5.5.0
case JSON_ERROR_INF_OR_NAN:
$error = 'Une ou plusieurs valeurs NAN ou INF dans la valeur à encoder.';
break;
case JSON_ERROR_UNSUPPORTED_TYPE:
$error = 'Une valeur d'un type qui ne peut pas être encodé a été donnée.';
break;
default:
$error = 'Une erreur JSON inconnue s\'est produite.';
break;
}
if ($error !== '') {
// générer l'exception ou quitter // ou autre chose :)
exit($error);
}
// tout va bien
return $result;
}
Test avec une ENTRÉE JSON valide
$json = '[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]';
$output = json_validate($json);
print_r($output);
Sortie valide
Array
(
[0] => stdClass Object
(
[user_id] => 13
[username] => stack
)
[1] => stdClass Object
(
[user_id] => 14
[username] => over
)
)
Test avec un JSON invalide
$json = '{background-color:yellow;color:#000;padding:10px;width:650px;}';
$output = json_validate($json);
print_r($output);
Sortie invalide
Erreur de syntaxe, JSON malformé.
Note supplémentaire pour (PHP >= 5.2 && PHP < 5.3.0)
Étant donné que json_last_error
n'est pas pris en charge dans PHP 5.2, vous pouvez vérifier si l'encodage ou le décodage renvoie un booléen FALSE
. Voici un exemple
// décoder les données JSON
$result = json_decode($json);
if ($result === FALSE) {
// JSON est invalide
}
3 votes
Considérez uniquement utiliser
json_decode
une seule fois... aussi, vérifiez les valeurs d'entrée et de retour dejson_decode
.6 votes
Alors, laquelle est la réponse?
11 votes
Le commutateur ternaire ici est redondant. Votre déclaration évalue déjà comme un booléen.
0 votes
Possible duplicate de Comment déterminer si une chaîne est un JSON valide ?
0 votes
Acceptez la réponse de Lewis Donovan ... elle fonctionne bien
0 votes
En regardant les solutions, performance vs simplicité aurait dû être le principal objectif de OP car le plus rapide dépend toujours du cas d'utilisation, par exemple, si vous savez que vous allez toujours traiter avec object/array, vérifier le premier caractère de la chaîne devrait suffire. Généraliser une solution ne peut jamais être "le plus rapide"; "plus rapide", peut-être.
0 votes
@Kirk-Ouimet de nombreuses réponses formidables ici. Pouvez-vous en accepter une pour donner le crédit qui lui revient?
0 votes
Mise à jour 2021 : La plupart des solutions ici se concentrent sur le moyen le plus court, mais l'OP a demandé le moyen le plus rapide. C'est la solution la plus rapide que j'ai trouvée - comparée à toutes les autres approches dans ce fil : stackoverflow.com/a/45241792/313501