47

非常に奇妙な問題が発生しました。

JSON Web サービスがあります。

このウェブサイトで確認するとhttp://www.freeformatter.com/json-formatter.html#ad-output

全て大丈夫。

しかし、このコードでJSONをロードすると:

  $data = file_get_contents('http://www.mywebservice');

if(!empty($data))
{

    $obj = json_decode($data);

 switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - JSON_ERROR_NONE';
    break;
    case JSON_ERROR_DEPTH:
        echo ' - JSON_ERROR_DEPTH';
    break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - JSON_ERROR_STATE_MISMATCH';
    break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' -  JSON_ERROR_CTRL_CHAR';
    break;
    case JSON_ERROR_SYNTAX:
        echo "\r\n\r\n - SYNTAX ERROR \r\n\r\n";
    break;
    case JSON_ERROR_UTF8:
        echo ' - JSON_ERROR_UTF8';
    break;
    default:
        echo ' - Unknown erro';
    break;
}

エラーが発生しました: SYNTAX ERROR

これはまったく役に立ちません。

悪夢です。

PHP 5.5 では、この関数を使用できることがわかります: http://php.net/manual/en/function.json-last-error-msg.php

(しかし、私はまだ PHP 5.5 のインストールに成功していません。この関数が詳細を教えてくれるかどうかはわかりません)

4

17 に答える 17

91

私は同じ問題に直面しました。実際には、見えない隠し文字がいくつかあり、それを削除する必要があります。多くのケースで機能するグローバル コードを次に示します。

<?php
$checkLogin = file_get_contents("http://yourwebsite.com/JsonData");

// This will remove unwanted characters.
// Check http://www.php.net/chr for details
for ($i = 0; $i <= 31; ++$i) { 
    $checkLogin = str_replace(chr($i), "", $checkLogin); 
}
$checkLogin = str_replace(chr(127), "", $checkLogin);

// This is the most common part
// Some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
// here we detect it and we remove it, basically it's the first 3 characters 
if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) {
   $checkLogin = substr($checkLogin, 3);
}

$checkLogin = json_decode( $checkLogin );
print_r($checkLogin);
?>
于 2013-12-30T18:55:20.483 に答える
60

(Byte Order Mark)を削除するBOMことは、多くの場合、必要な解決策です。

function removeBOM($data) {
    if (0 === strpos(bin2hex($data), 'efbbbf')) {
       return substr($data, 3);
    }
    return $data;
}

BOMはあってはいけませんが、あっても見えないので見えません!!

HTML の BOM に関する W3C を参照してください。

修正するファイルがたくさんある場合は、BOM クリーナーを使用してください。

于 2015-07-23T18:07:20.680 に答える
34

json_decodeの前に、文字列にストリップスラッシュを追加してこの問題を解決しました。

$data = stripslashes($data); 
$obj = json_decode($data);
于 2015-02-16T11:46:58.350 に答える
1

JSONを表示していませんが、これは引数に無効なUTF-8シーケンスである可能性があるように聞こえます.ほとんどのオンラインバリデーターはそれをキャッチしません. データが UTF-8 であることを確認し、外国語の文字が含まれているかどうかも確認してください。エラーを確認するのに PHP5 は必要ありません。問題をログに記録するにはerror_log()を使用してください。

于 2013-06-20T17:30:34.687 に答える
-2

私は同じ問題を抱えていました。私にとっては、それが原因でしたecho "<br/><pre>"exit(json_encode(utf8ize($resp_array)));At the begin of file i had decleared break line tag...を使用して json 文字列を別の php ファイルに渡そうとしていましたが、これは私にとってはエラーでした。この改行タグを削除すると、json文字列を他のphpファイルにデコードできました..

于 2017-01-03T09:35:06.967 に答える