2016-07-18 7 views
0

JMS Serializer経由でREST要求の非直列化が終了しましたJSON、不正な形式のUTF-8文字をデコードできませんでした。この例外は、PHP関数json_las_errorJSON_ERROR_UTF8という値を返すときに発生します。私は何時間も成功を収めずに、原因(よく形成されたUTF-8、BOMなど)を検索します。 UTF-8はよく定義されていました。この変更は成功で終了し、逆シリアル化した後JSON、不正な形式のUTF-8文字をデコードできませんでした - 予期せぬPHP beahviour

class JsonDeserializationVisitor extends GenericDeserializationVisitor 
{ 
    protected function decode($str) 
    { 
     $decoded = json_decode($str, true); 
     $error = json_last_error(); 

     switch ($error) { 
      case JSON_ERROR_NONE: 
       return $decoded; 

      case JSON_ERROR_DEPTH: 
       throw new RuntimeException('Could not decode JSON, maximum stack depth exceeded.'); 

      case JSON_ERROR_STATE_MISMATCH: 
       throw new RuntimeException('Could not decode JSON, underflow or the nodes mismatch.'); 

      case JSON_ERROR_CTRL_CHAR: 
       throw new RuntimeException('Could not decode JSON, unexpected control character found.'); 

      case JSON_ERROR_SYNTAX: 
       throw new RuntimeException('Could not decode JSON, syntax error - malformed JSON.'); 

      case JSON_ERROR_UTF8: 
       throw new RuntimeException('Could not decode JSON, malformed UTF-8 characters (incorrectly encoded?)'); 

      default: 
       throw new RuntimeException('Could not decode JSON.'); 
     } 
    } 
} 

:folowsとして

class JsonDeserializationVisitor extends GenericDeserializationVisitor 
{ 
    protected function decode($str) 
    { 
     $decoded = json_decode($str, true); 

     switch (json_last_error()) { 
      case JSON_ERROR_NONE: 
       return $decoded; 

      case JSON_ERROR_DEPTH: 
       throw new RuntimeException('Could not decode JSON, maximum stack depth exceeded.'); 

      case JSON_ERROR_STATE_MISMATCH: 
       throw new RuntimeException('Could not decode JSON, underflow or the nodes mismatch.'); 

      case JSON_ERROR_CTRL_CHAR: 
       throw new RuntimeException('Could not decode JSON, unexpected control character found.'); 

      case JSON_ERROR_SYNTAX: 
       throw new RuntimeException('Could not decode JSON, syntax error - malformed JSON.'); 

      case JSON_ERROR_UTF8: 
       throw new RuntimeException('Could not decode JSON, malformed UTF-8 characters (incorrectly encoded?)'); 

      default: 
       throw new RuntimeException('Could not decode JSON.'); 
     } 
    } 
} 

(json_last_errorは、switch文で直接ではありません):それから私は、JMSシリアライザの変更コードを試してみました。この動作の説明はありますか?それはPHPのバグですか?ありがとう。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> 
 
<html xmlns="http://www.w3.org/1999/xhtml"><head> 
 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
 
<style type="text/css"> 
 
body {background-color: #fff; color: #222; font-family: sans-serif;} 
 
pre {margin: 0; font-family: monospace;} 
 
a:link {color: #009; text-decoration: none; background-color: #fff;} 
 
a:hover {text-decoration: underline;} 
 
table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px #ccc;} 
 
.center {text-align: center;} 
 
.center table {margin: 1em auto; text-align: left;} 
 
.center th {text-align: center !important;} 
 
td, th {border: 1px solid #666; font-size: 75%; vertical-align: baseline; padding: 4px 5px;} 
 
h1 {font-size: 150%;} 
 
h2 {font-size: 125%;} 
 
.p {text-align: left;} 
 
.e {background-color: #ccf; width: 300px; font-weight: bold;} 
 
.h {background-color: #99c; font-weight: bold;} 
 
.v {background-color: #ddd; max-width: 300px; overflow-x: auto;} 
 
.v i {color: #999;} 
 
img {float: right; border: 0;} 
 
hr {width: 934px; background-color: #ccc; border: 0; height: 1px;} 
 
</style> 
 
<title>phpinfo()</title><meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE"></head> 
 
<body><div class="center"> 
 
<table> 
 
<tbody><tr class="h"><td> 
 
<a href="http://www.php.net/"><img src="data:image/png;base64,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" alt="PHP logo" border="0"></a><h1 class="p">PHP Version 5.6.21</h1> 
 
</td></tr> 
 
</tbody></table> 
 
<table> 
 
<tbody><tr><td class="e">System </td><td class="v">Windows NT SM09571 6.2 build 9200 (Windows Server 2012 Standard Edition) AMD64 </td></tr> 
 
<tr><td class="e">Build Date </td><td class="v">Apr 27 2016 20:06:06 </td></tr> 
 
<tr><td class="e">Compiler </td><td class="v">MSVC11 (Visual C++ 2012) </td></tr> 
 
<tr><td class="e">Architecture </td><td class="v">x64 </td></tr> 
 
<tr><td class="e">Configure Command </td><td class="v">cscript /nologo 
 
configure.js "--enable-snapshot-build" "--disable-isapi" 
 
"--enable-debug-pack" "--without-mssql" "--without-pdo-mssql" 
 
"--without-pi3web" 
 
"--with-pdo-oci=c:\php-sdk\oracle\x64\instantclient_12_1\sdk,shared" 
 
"--with-oci8-12c=c:\php-sdk\oracle\x64\instantclient_12_1\sdk,shared" 
 
"--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" 
 
"--with-mcrypt=static" "--without-analyzer" "--with-pgo" </td></tr> 
 
<tr><td class="e">Server API </td><td class="v">Apache 2.0 Handler </td></tr> 
 
<tr><td class="e">Virtual Directory Support </td><td class="v">enabled </td></tr> 
 
<tr><td class="e">Configuration File (php.ini) Path </td><td class="v">C:\Windows </td></tr> 
 
<tr><td class="e">Loaded Configuration File </td><td class="v">C:\www\ApachePUD\php\php.ini </td></tr> 
 
<tr><td class="e">Scan this dir for additional .ini files </td><td class="v">(none) </td></tr> 
 
<tr><td class="e">Additional .ini files parsed </td><td class="v">(none) </td></tr> 
 
<tr><td class="e">PHP API </td><td class="v">20131106 </td></tr> 
 
<tr><td class="e">PHP Extension </td><td class="v">20131226 </td></tr> 
 
<tr><td class="e">Zend Extension </td><td class="v">220131226 </td></tr> 
 
<tr><td class="e">Zend Extension Build </td><td class="v">API220131226,TS,VC11 </td></tr> 
 
<tr><td class="e">PHP Extension Build </td><td class="v">API20131226,TS,VC11 </td></tr> 
 
<tr><td class="e">Debug Build </td><td class="v">no </td></tr> 
 
<tr><td class="e">Thread Safety </td><td class="v">enabled </td></tr> 
 
<tr><td class="e">Zend Signal Handling </td><td class="v">disabled </td></tr> 
 
<tr><td class="e">Zend Memory Manager </td><td class="v">enabled </td></tr> 
 
<tr><td class="e">Zend Multibyte Support </td><td class="v">provided by mbstring </td></tr> 
 
<tr><td class="e">IPv6 Support </td><td class="v">enabled </td></tr> 
 
<tr><td class="e">DTrace Support </td><td class="v">disabled </td></tr> 
 
<tr><td class="e">Registered PHP Streams</td><td class="v">php, file, glob, data, http, ftp, zip, compress.zlib, https, ftps, phar</td></tr> 
 
<tr><td class="e">Registered Stream Socket Transports</td><td class="v">tcp, udp, ssl, sslv3, tls, tlsv1.0, tlsv1.1, tlsv1.2</td></tr> 
 
<tr><td class="e">Registered Stream Filters</td><td class="v">convert.iconv.*, 
 
mcrypt.*, mdecrypt.*, string.rot13, string.toupper, string.tolower, 
 
string.strip_tags, convert.*, consumed, dechunk, zlib.*</td></tr> 
 
</tbody></table> 
 

 
</div></body></html>

+0

リクエスト自体を提供できますか? –

+0

同じデータをデコードしますか? –

+0

すみません。私はいくつかの重要な情報を指定していませんでした。 'クラスJsonDeserializationVisitorがGenericDeserializationVisitor { 保護機能デコード($ strの) { $を拡張:私はあなたが見ることができるようにはい、常に同じデータをデコード*のみ生産 で、私の地元的環境上の問題を再現することはできません* t = json_decode($ str、true); $ error = json_last_error(); // SUCCESS $ decoded = json_decode($ str、true); //成功しました。 スイッチ(json_last_error()){// JSON_ERROR_UTF8 - それは私を混乱させる ケースJSON_ERROR_NONE: ますreturn $デコードされ; ' – user2677847

答えて

0

あなたはそれを介してJSONを実行するとJSONLintは何と言っていますか?

+0

OPの質問に答えていません。代わりにコメントを使用してください。 – YvesLeBorg

+0

他の多くのサービスを使用して確認しました。 [jsonformatter.curiousconcept.com](https://jsonformatter.curiousconcept.com/)。どこでもJSONが有効でした。 – user2677847

関連する問題