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.
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 ?
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.
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.
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!