ホームページ >バックエンド開発 >PHPの問題 >php json_decode の解析が失敗した場合の対処方法

php json_decode の解析が失敗した場合の対処方法

藏色散人
藏色散人オリジナル
2021-09-10 09:38:374488ブラウズ

php json_decode 解析失敗の解決策: 1. json_last_error およびその他の関数を通じてエラー コードを取得します; 2. utf8 エンコード範囲に従って不正な utf8 文字を削除します。

php json_decode の解析が失敗した場合の対処方法

この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター

php json_decode解析失敗の管理?

php json_decode 解析の失敗とエラー処理

通常の状況では、json コンテンツの一部を取得した後、直接 json_decode($content, true) が変換されます。ぜひ使ってみてください、とても便利です。
ただし、JSON コンテンツを提供するインターフェースに問題があり、提供された JSON が標準ではないか、単にエラーがある場合は、問題を見つける方法を見つける必要があります。
まずは json_encode のマニュアルを見てみましょう
https://www.php.net/manual/en/function.json-last-error.php

NULL を返します失敗時

 //  $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

どこが間違っていたのかをどうやって知ることができるでしょうか?

1. エラー コードを取得します。

php には json_last_error 関数があります。
https://www.php.net/manual/en/function を参照してください。 json -last-error.php

何が問題だったかを示すエラー コードが返されます。
エラーコードがわかりませんか? json_last_error_msg を使用できます。
https://www.php.net/manual/en/function.json-last-error-msg.php

を参照してください。ただし、json_last_error_msg は php >= でのみ使用できます。 5.5.0 異なるバージョンでのみ存在します。それより前のバージョンの場合は、自分で定義してください。

2. php json エラー コードの下位バージョンは不完全です

しかし、マニュアルに注意して見ると、エラー コードの多くが json_last_error# で定義されていることがわかります。 ## は上位バージョンでのみ利用可能です。はい、php の下位バージョンはサービスを停止しています。たとえば、JSON_ERROR_UTF8 エラー コードは、json 文字列に不正な utf8 文字が存在することを明確に示していますが、この文字は Php >= 5.3.3 にのみ存在します。悲劇的なのは、私の php が 5.3.2 であることです....

所以,如果你的json_last_error返回的是JSON_ERROR_NONE(0) ,并不是说没有错误,而只是这个错误在你的低版本php中没有定义。再说,没有错误怎么会失败呢....

json 形式が間違っている場合は、php のバージョンがどんなに低くても、JSON_ERROR_SYNTAX が表示されるため、最初の可能性は JSON_ERROR_NONE です。 . 不正な utf8 文字列について考える.

3. json 内の不正な utf8 文字に対処する方法

utf8 のエンコード範囲に応じて、不正な utf8 文字を削除できます。

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

を参照してください。無効な文字は? に置き換えられます。必要に応じて自分で変更してください。

推奨学習: 「

PHP ビデオ チュートリアル

以上がphp json_decode の解析が失敗した場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。