Maison  >  Article  >  développement back-end  >  Raisons et solutions aux erreurs de fonction json_encode() en PHP

Raisons et solutions aux erreurs de fonction json_encode() en PHP

王林
王林original
2023-05-11 09:03:053423parcourir

Avec le développement continu des applications web, l'interaction des données est devenue un maillon très important. Parmi eux, JSON (JavaScript Object Notation) est un format d'échange de données léger largement utilisé pour l'interaction de données front-end et back-end. En PHP, la fonction json_encode() peut convertir un tableau ou un objet PHP en une chaîne au format JSON, et la fonction json_decode() peut convertir une chaîne au format JSON en un tableau ou un objet PHP. Cependant, vous rencontrez parfois des erreurs dans la fonction json_encode(). Cet article abordera les causes et les solutions à ces erreurs.

1. Erreurs courantes de la fonction json_encode()

  1. JSON_ERROR_UTF8

La raison de cette erreur est que le tableau ou l'objet PHP contient des caractères UTF-8 non valides. En PHP, UTF-8 est un encodage utilisé pour transmettre et stocker des caractères Unicode sur le Web. Cependant, certains caractères non UTF-8 apparaissent parfois dans la chaîne, tels que des caractères dans des formats de codage tels que ISO-8859-1, et ces caractères provoquent des erreurs JSON_ERROR_UTF8. Par exemple :

$array = array(
    'name' => '张三',
    'email' => '张三@example.com',

);
$json = json_encode($array);

Le code ci-dessus générera une erreur JSON_ERROR_UTF8.

  1. JSON_ERROR_DEPTH

La raison pour laquelle cette erreur se produit est que le niveau du tableau ou de l'objet PHP est trop profond, dépassant la limite que la fonction json_encode() peut gérer. Par défaut, le nombre maximum de couches que la fonction json_encode() peut gérer est de 128. Par exemple :

$array = array();
for($i = 1; $i <= 150; $i++){
    $array = array(
        'level'.$i => $array
    );
}
$json = json_encode($array);

Le code ci-dessus générera une erreur JSON_ERROR_DEPTH.

  1. JSON_ERROR_RECURSION

La raison pour laquelle cette erreur se produit est qu'il existe une référence circulaire dans le tableau ou l'objet PHP. Par exemple :

class Person{
    public $name;
    public $spouse;
}
$person1 = new Person();
$person1->name = '张三';
$person2 = new Person();
$person2->name = '李四';
$person1->spouse = $person2;
$person2->spouse = $person1;
$json = json_encode($person1);

Le code ci-dessus générera une erreur JSON_ERROR_RECURSION.

  1. Autres erreurs

En plus des trois erreurs ci-dessus, d'autres erreurs peuvent survenir dans la fonction json_encode(), telles que JSON_ERROR_CTRL_CHAR, JSON_ERROR_SYNTAX, etc.

2. Solution

Il existe différentes solutions pour différentes erreurs.

  1. Résolution de l'erreur JSON_ERROR_UTF8

Si un tableau ou un objet PHP contient des caractères non UTF-8, vous pouvez utiliser la fonction mb_convert_encoding() intégrée de PHP pour le convertir au format UTF-8. Par exemple :

$array = array(
    'name' => '张三',
    'email' => '张三@example.com',

);
foreach($array as &$value){
    $value = mb_convert_encoding($value, 'UTF-8', 'GBK');
}
unset($value);
$json = json_encode($array);
  1. Résolution de l'erreur JSON_ERROR_DEPTH

Si le niveau du tableau ou de l'objet PHP est trop profond, vous pouvez passer un paramètre options lors de l'appel de la fonction json_encode() pour spécifier le nombre maximum de niveaux pouvant être traités . Par exemple :

$array = array();
for($i = 1; $i <= 150; $i++){
    $array = array(
        'level'.$i => $array
    );
}
$json = json_encode($array, JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_UNESCAPED_UNICODE, 512);

Dans le code ci-dessus, la valeur du paramètre options est de 512, c'est-à-dire que le nombre maximum de couches est de 512. Si ce nombre de niveaux est dépassé, une erreur JSON_ERROR_DEPTH sera générée.

  1. Résoudre l'erreur JSON_ERROR_RECURSION

Si une référence circulaire se produit dans un tableau ou un objet PHP, vous pouvez utiliser le deuxième paramètre de la fonction json_encode() pour spécifier un objet traversable, tel que Iterator. Par exemple :

class Person{
    public $name;
    public $spouse;
    public function jsonSerialize(){
        return [
            'name' => $this->name,
            'spouse' => $this->spouse->name
        ];
    }
}
$person1 = new Person();
$person1->name = '张三';
$person2 = new Person();
$person2->name = '李四';
$person1->spouse = $person2;
$person2->spouse = $person1;
$json = json_encode(array(
    'person1' => $person1,
    'person2' => $person2
), JSON_PARTIAL_OUTPUT_ON_ERROR, 512);

Dans le code ci-dessus, la classe Person implémente la méthode jsonSerialize(), qui renvoie un tableau pour la fonction json_encode() afin de sérialiser l'objet dans une chaîne JSON. Lors de son utilisation, lors de l'appel de la fonction json_encode(), transmettez simplement la constante JSON_PARTIAL_OUTPUT_ON_ERROR comme deuxième paramètre.

  1. Résoudre d'autres erreurs

Les solutions aux autres erreurs doivent être analysées et traitées en fonction de la situation spécifique.

En résumé, la fonction json_encode() peut facilement sérialiser des tableaux ou des objets PHP dans des chaînes au format JSON, mais lorsque vous l'utilisez, vous devez faire attention à savoir si les données transmises sont légales et effectuer une gestion des erreurs appropriée.

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