2009-07-27 14 views
36

Est-ce que quelqu'un connaît un extrait de fonction is_JSON robuste (et à l'épreuve des balles) pour PHP? J'ai (évidemment) une situation où j'ai besoin de savoir si une chaîne est JSON ou non. Hmm, peut-être passer par une demande/réponse JSONLint, mais cela semble un peu exagéré.Comment déterminer si une chaîne est JSON valide?

+1

Tirer; J'avais une solution pare-balles à portée de main, mais elle n'était pas très robuste, donc j'ai dû la mettre au rebut: P –

Répondre

60

Si vous utilisez le construit en json_decode fonction PHP, json_last_error retourne la dernière erreur (par exemple JSON_ERROR_SYNTAX lorsque votre chaîne n'a pas été JSON). De toute façon

Généralement, json_decode renvoie null de toute façon.

+3

Oui, je suis un idiot. C'était évident et je l'ai raté. Je peux envelopper dans ce dont j'ai besoin. Merci. – Spot

+0

Solution solide dans la plupart des cas, mais faites attention. json_decode peut également analyser, par exemple, chaînes numériques. Un numéro de téléphone dans une chaîne serait converti en un entier. Cependant, cela ne se produit pas sur tous les serveurs. Sur ma machine Windows, je reçois des entiers, sur le système de développement Linux, je deviens faux. Je suppose que cela dépend de votre installation PHP et de la configuration – StoryTeller

+0

Comme StoryTeller mentionné - json_decode ("51232") évalue à 51232, donc peut ne pas être utile dans toutes les situations –

17

Qu'en est-il de l'utilisation de json_decode, qui devrait renvoyer null si la chaîne indiquée n'était pas une donnée codée JSON valide?

Voir l'exemple 3 sur la page de manuel:

// the following strings are valid JavaScript but not valid JSON 

// the name and value must be enclosed in double quotes 
// single quotes are not valid 
$bad_json = "{ 'bar': 'baz' }"; 
json_decode($bad_json); // null 

// the name must be enclosed in double quotes 
$bad_json = '{ bar: "baz" }'; 
json_decode($bad_json); // null 

// trailing commas are not allowed 
$bad_json = '{ bar: "baz", }'; 
json_decode($bad_json); // null 
4

Le json_decode() avec json_last_error() ne fonctionne-t-il pas pour vous? Cherchez-vous simplement une méthode pour dire "cela ressemble-t-il à JSON" ou bien le valider? json_decode() serait le seul moyen de le valider efficacement dans PHP.

3
 
$this->post_data = json_decode(stripslashes($post_data)); 
    if($this->post_data === NULL) 
    { 
    die('{"status":false,"msg":"The post_data parameter must be valid JSON"}'); 
    } 
13

Pour mes projets, j'utiliser cette fonction (s'il vous plaît lisez la section "Remarque" sur les json_decode() docs).

En passant les mêmes arguments que vous passeriez à json_decode(), vous pouvez détecter les "erreurs" d'application spécifiques (par exemple les erreurs de profondeur)

Avec PHP> = 5,6

// PHP >= 5.6 
function is_JSON(...$args) { 
    json_decode(...$args); 
    return (json_last_error()===JSON_ERROR_NONE); 
} 

Avec PHP> = 5.3

// PHP >= 5.3 
function is_JSON() { 
    call_user_func_array('json_decode',func_get_args()); 
    return (json_last_error()===JSON_ERROR_NONE); 
} 

exemple d'utilisation:

$mystring = '{"param":"value"}'; 
if (is_JSON($mystring)) { 
    echo "Valid JSON string"; 
} else { 
    $error = json_last_error_msg(); 
    echo "Not valid JSON string ($error)"; 
} 
+0

Je ne suis pas un expert en PHP, mais cette solution ne semble pas très efficace, comme lorsque le décodage JSON est requis, il le fait deux fois: une fois en testant si la chaîne est JSON valide, et la seconde fois en le décodant réellement. Il semble qu'il serait plus sage de simplement avoir cette fonction pour vérifier la dernière erreur JSON, en supposant que json_decode a déjà été exécuté. Je me réjouis d'autres opinions. –

+0

Salut @LiranH, l'affiche d'origine a demandé une fonction 'is_JSON' donc je ne peux pas supposer dans la fonction que json_decode était juste exécuté sur la chaîne demandée. Dans ce cas, votre fonction s'appellera 'is_last_json_decoded_string_a_JSON_string'. – cgaldiolo

+0

C'est assez juste @cgaldiolo –

Questions connexes