Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Sebab dan penyelesaian untuk ralat fungsi json_encode() dalam PHP

Sebab dan penyelesaian untuk ralat fungsi json_encode() dalam PHP

王林
王林asal
2023-05-11 09:03:053424semak imbas

Dengan pembangunan aplikasi web yang berterusan, interaksi data telah menjadi pautan yang sangat penting. Antaranya, JSON (JavaScript Object Notation) ialah format pertukaran data ringan yang digunakan secara meluas untuk interaksi data front-end dan back-end. Dalam PHP, fungsi json_encode() boleh menukar tatasusunan atau objek PHP kepada rentetan format JSON, dan fungsi json_decode() boleh menukar rentetan format JSON kepada tatasusunan atau objek PHP. Walau bagaimanapun, kadangkala anda menghadapi ralat dalam fungsi json_encode() Artikel ini akan membincangkan punca dan penyelesaian kepada ralat tersebut.

1. Ralat biasa fungsi json_encode()

  1. JSON_ERROR_UTF8

Sebab ralat ini ialah tatasusunan atau objek PHP mengandungi UTF yang tidak sah - 8 aksara. Dalam PHP, UTF-8 ialah pengekodan yang digunakan untuk menghantar dan menyimpan aksara Unicode di web. Walau bagaimanapun, kadangkala beberapa aksara bukan UTF-8 muncul dalam rentetan, seperti aksara dalam format pengekodan seperti ISO-8859-1, dan aksara ini akan menyebabkan ralat JSON_ERROR_UTF8. Contohnya:

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

);
$json = json_encode($array);

Kod di atas akan menjana ralat JSON_ERROR_UTF8.

  1. JSON_ERROR_DEPTH

Ralat ini berlaku kerana tahap tatasusunan atau objek PHP terlalu dalam dan melebihi had yang boleh dikendalikan oleh fungsi json_encode(). Secara lalai, bilangan maksimum lapisan yang boleh dikendalikan oleh fungsi json_encode() ialah 128. Contohnya:

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

Kod di atas akan menjana ralat JSON_ERROR_DEPTH.

  1. JSON_ERROR_RECURSION

Ralat ini berlaku kerana terdapat rujukan bulat dalam tatasusunan atau objek PHP. Contohnya:

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);

Kod di atas akan menjana ralat JSON_ERROR_RECURSION.

  1. Ralat lain

Selain daripada tiga ralat di atas, fungsi json_encode() juga mungkin menyebabkan ralat lain, seperti JSON_ERROR_CTRL_CHAR, JSON_ERROR_SYNTAX, dsb.

2. Penyelesaian

Terdapat penyelesaian yang berbeza untuk ralat yang berbeza.

  1. Menyelesaikan Ralat JSON_ERROR_UTF8

Jika tatasusunan atau objek PHP mengandungi aksara bukan UTF-8, anda boleh menggunakan fungsi mb_convert_encoding() terbina dalam PHP untuk menukarnya kepada format UTF- 8. Contohnya:

$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. Selesaikan ralat JSON_ERROR_DEPTH

Jika tahap tatasusunan atau objek PHP terlalu dalam, anda boleh lulus parameter pilihan apabila memanggil json_encode() fungsi untuk menentukan Bilangan maksimum lapisan yang boleh diproses. Contohnya:

$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);

Dalam kod di atas, nilai parameter pilihan ialah 512, iaitu bilangan maksimum lapisan ialah 512. Jika bilangan tahap ini melebihi, ralat JSON_ERROR_DEPTH akan dihasilkan.

  1. Menyelesaikan ralat JSON_ERROR_RECURSION

Jika rujukan bulat berlaku dalam tatasusunan atau objek PHP, anda boleh menggunakan parameter kedua fungsi json_encode() untuk menentukan objek yang boleh dilalui , seperti Iterator. Contohnya:

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);

Dalam kod di atas, kelas Person melaksanakan kaedah jsonSerialize(), yang mengembalikan tatasusunan untuk fungsi json_encode() untuk mensirikan objek ke dalam rentetan JSON. Apabila menggunakannya, apabila memanggil fungsi json_encode(), hanya lulus pemalar JSON_PARTIAL_OUTPUT_ON_ERROR sebagai parameter kedua.

  1. Menyelesaikan ralat lain

Penyelesaian kepada ralat lain perlu dianalisis dan diproses mengikut situasi tertentu.

Ringkasnya, fungsi json_encode() boleh dengan mudah menyusun tatasusunan PHP atau objek ke dalam rentetan format JSON, tetapi apabila menggunakannya, anda perlu memberi perhatian sama ada data yang diluluskan adalah sah dan melaksanakan pengendalian ralat yang sesuai. .

Atas ialah kandungan terperinci Sebab dan penyelesaian untuk ralat fungsi json_encode() dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn