Maison >développement back-end >Problème PHP >Que faire si l'analyse php json_decode échoue

Que faire si l'analyse php json_decode échoue

藏色散人
藏色散人original
2021-09-10 09:38:374490parcourir

Solutions à l'échec de l'analyse PHP json_decode : 1. Obtenez le code d'erreur via json_last_error et d'autres fonctions ; 2. Éliminez les caractères utf8 illégaux en fonction de la plage d'encodage utf8.

Que faire si l'analyse php json_decode échoue

L'environnement d'exploitation de cet article : système Windows7, version PHP7.1, ordinateur DELL G3

php json_decode Que dois-je faire si l'analyse échoue ?

Échec de l'analyse de php json_decode et gestion des erreurs

Normalement, lorsque vous obtenez un morceau de contenu json, vous pouvez directement convertir json_decode($content, true) en un tableau à utiliser, ce qui est très pratique.
Cependant, s'il y a un problème avec l'interface qui vous fournit du contenu json et que le json fourni n'est pas standard ou contient simplement des erreurs, alors vous devez trouver un moyen de trouver le problème.
Jetons d'abord un coup d'œil au manuel de json_encode
https://www.php.net/manual/en/function.json-last-error.php

Renvoie NULL en cas d'échec

 //  $json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":"Corwien"}'; 
 $json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":}';  //错误的json格式
 $result = json_decode($json, true);
  if(!$result)
  {
        //error handle ,错误处理
        $ret = json_last_error();
        print_r($ret);   //打印为: 4,查错误信息表,可知是语法错误
        
  }   

json_last_error错误msg对照表:
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

Comment faire on sait où est l'erreur ?

1. Obtenez le code d'erreur

php a une fonction json_last_error, voir
https://www.php.net/manual/en/function.json-last-error.php

Il renverra l'erreur code pour dire ce qui n'a pas fonctionné pour nous.
Vous ne comprenez pas le code d'erreur ? Vous pouvez utiliser json_last_error_msg, voir
https://www.php.net/manual/en/function.json-last-error-msg.php

Mais json_last_error_msg n'est disponible qu'en version php >= 5.5.0, si le version Low, définissez-en une vous-même.

2. La version basse des codes d'erreur php json est incomplète

Cependant, si vous faites attention au manuel, vous constaterez que la plupart des codes d'erreur définis par json_last_error ne sont disponibles que dans la version haute, et la la version basse de php est abandonnée. Par exemple, le code d'erreur JSON_ERROR_UTF8 nous indique clairement qu'il y a des caractères utf8 illégaux dans la chaîne json, mais il n'est disponible qu'en Php >= 5.3.3. Ce qui est très tragique, c'est que mon php est 5.3.2....

所以,如果你的json_last_error返回的是JSON_ERROR_NONE(0) ,并不是说没有错误,而只是这个错误在你的低版本php中没有定义。再说,没有错误怎么会失败呢....

Si le format json est erroné, peu importe la version basse de php, il vous dira JSON_ERROR_SYNTAX, donc lorsque vous rencontrez JSON_ERROR_NONE, la première possibilité est d'utiliser des caractères utf8 illégaux. Pensées de chaîne.

3. Comment gérer les caractères utf8 illégaux dans json

Selon la plage de codage de utf8, les caractères utf8 illégaux peuvent être éliminés.
Voir https://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
 '|[\x00-\x7F][\x80-\xBF]+'.
 '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
 '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
 '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
 '?', $some_string );
 
//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
 '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string );

Remplacez les caractères illégaux par ? et modifiez-les si nécessaire.

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn