Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apa yang perlu dilakukan jika penghuraian php json_decode gagal

Apa yang perlu dilakukan jika penghuraian php json_decode gagal

藏色散人
藏色散人asal
2021-09-10 09:38:374429semak imbas

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.

Apa yang perlu dilakukan jika penghuraian php json_decode gagal

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?

1. Dapatkan kod ralat

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.

2. Versi rendah kod ralat php json tidak lengkap

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

3 Cara menangani aksara utf8 haram dalam json

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!

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