php json_decode解析失敗およびエラー処理

2537 ワード

jsonの処理について良い文章を見ました.decode解析に失敗したメソッドは、非常に詳細に書かれており、ここにロードされます.
一般的に、jsonコンテンツを取得し、直接json_decode($content,true)はarrayに変えて使いやすくなりました.しかし、jsonコンテンツを提供するインタフェースに問題があったり、与えられたjsonが標準的ではないか、いっそ間違っている場合は、問題を見つける方法を考えなければなりません.まずjsonを見てみましょうencodemanulhttp://cn2.php.net/manual/en/... 失敗時に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関数、参照http://cn2.php.net/manual/en/... エラーコードが返され、エラーの原因を教えてくれます.エラーコードが読めませんか?json_を使うことができますlast_error_msg、見てhttp://cn2.php.net/manual/en/... でもjson_last_error_msgはphp>=5.5のみである.0バージョンしかありませんが、バージョンが低ければ、自分で定義しましょう.
2、低バージョンphp jsonエラーコード不全
でも、manualを見てみると、json_last_errorが定義した多くのエラーコードは高バージョンでしかないので、低バージョンのphpは料理をやめました.例えばJSON_ERROR_UTF 8というエラーコードは、json文字列に不正なutf 8文字があることを明確に示していますが、Php>=5.3.3にしかありません.悲しいことに、私のphpは5.3.です.2....
  ,    json_last_error    JSON_ERROR_NONE(0) ,        ,             php     。  ,          ....

jsonフォーマットが間違っていたら、どんなに低いバージョンのphpでもJSON_を教えてくれます.ERROR_SYNTAXだからJSONにぶつかるERROR_NONEの最初の可能性は不正utf 8文字列に考えた.
3、jsonの不正utf 8文字の処理方法
utf 8の符号化範囲によれば、不正なutf 8文字を除去することができる.参照http://magp.ie/2011/01/06/rem...
//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 json_decode失敗