Rumah > Artikel > pembangunan bahagian belakang > Apa yang perlu dilakukan jika penghuraian php json_decode gagal
Penyelesaian kepada kegagalan php json_decode parsing: 1. Dapatkan kod ralat melalui json_last_error dan fungsi lain 2. Hapuskan aksara utf8 yang tidak sah mengikut julat pengekodan utf8.
Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer DELL G3
Apa yang perlu lakukan jika php json_decode parsing gagal?
kegagalan penghuraian json_decode php dan pengendalian ralat
Secara amnya, selepas mendapat sekeping kandungan json, terus json_decode($content, true) ditukar kepada tatasusunan Datang dan gunakannya, ia sangat mudah.
Walau bagaimanapun, jika terdapat sesuatu yang salah dengan antara muka yang memberikan anda kandungan json, dan json yang disediakan tidak standard atau hanya mempunyai ralat, maka anda perlu mencari jalan untuk mencari masalah tersebut.
Mula-mula lihat json_encode manul
https://www.php.net/manual/en/function.json-last-error.php
Kembalikan NULL apabila gagal
// $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
Bagaimana kita tahu di mana silap kita?
php mempunyai fungsi json_last_error, lihat
https://www.php.net/manual/en/function. json -last-error.php
Ia akan mengembalikan kod ralat untuk memberitahu kami perkara yang salah.
Tidak dapat memahami kod ralat? Anda boleh menggunakan json_last_error_msg, lihat
https://www.php.net/manual/en/function.json-last-error-msg.php
Tetapi json_last_error_msg hanya tersedia dalam php >= 5.5.0 Ia hanya wujud dalam versi yang berbeza Jika versi lebih rendah, tentukan sendiri.
Walau bagaimanapun, jika anda memberi perhatian kepada manual, anda akan mendapati bahawa banyak kod ralat yang ditakrifkan oleh json_last_error hanya tersedia dalam versi yang lebih tinggi Ya, versi php yang lebih rendah tidak digunakan. Contohnya, kod ralat JSON_ERROR_UTF8 dengan jelas memberitahu kami bahawa terdapat aksara utf8 yang tidak sah dalam rentetan json, tetapi ia hanya tersedia dalam Php >= 5.3.3. Tragedinya ialah php saya ialah 5.3.2....
所以,如果你的json_last_error返回的是JSON_ERROR_NONE(0) ,并不是说没有错误,而只是这个错误在你的低版本php中没有定义。再说,没有错误怎么会失败呢....
Jika format json salah, tidak kira betapa rendahnya versi php, ia akan memberitahu anda JSON_ERROR_SYNTAX, jadi JSON_ERROR_NONE ialah kemungkinan pertama Fikirkan rentetan utf8 haram
Menurut julat pengekodan utf8, aksara utf8 haram boleh dihapuskan.
Lihat 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 );
Berikut ialah penggantian aksara haram ?, ubah sendiri mengikut keperluan.
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Apa yang perlu dilakukan jika penghuraian php json_decode gagal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!