json_decodeはJSON_ERROR_SYNTAXを返すが、オンラインフォーマッタはJSONはOKだと言う

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

私はJSONウェブサービスを持っています。

私はこのウェブサイトhttp://www.freeformatter.com/json-formatter.html#ad-output でそれをチェックするとき

すべてOKです。

しかし、私はこのコードで私の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をインストールすることに成功していませんし、この関数が私に詳細を与えるかどうかはわかりません)

私も同じ問題に直面しました。実際、いくつかの隠された文字が見えないので、それを削除する必要があります。 以下は、多くの場合において有効なグローバルコードです。


<?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 
解説 (6)

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

$data = stripslashes($data); 
$obj = json_decode($data);
解説 (2)

JSONが表示されていませんが、引数のUTF-8シーケンスが無効で、ほとんどのオンラインバリデータがこれを検出しません。 データがUTF-8であることを確認し、外字があるかどうかもチェックしてください。 PHP5でなくても、error_log()を使って問題を記録することができます。

解説 (0)