web-dev-qa-db-ja.com

json_decode()はnullの問題を返します

JSONに問題があります。 PHP 5.3(json_last_error()を使用できないため)で正しく返され、文字列をjson_decode(json_decode( '{...}')に明示的にコピーすると正常に返されます) 。結果を変数として渡し、php 5.2を使用している場合にのみ、nullが返されます。これが必要です。

出力は、PHPUnitのJSONロギングから取得されます。

[
    {
        "event": "suiteStart",
        "suite": "",
        "tests": 2
    },
    {
        "event": "suiteStart",
        "suite": "TagTestCase",
        "tests": 2
    },
    {
        "event": "test",
        "suite": "TagTestCase",
        "test": "TagTestCase::test_it",
        "status": "fail",
        "time": 0.00248718261719,
        "trace": [
            {
                "file": "\/UnitTest\/PHPUnit.php",
                "line": 98,
                "function": "run",
                "class": "PHPUnit_Framework_TestSuite",
                "type": "->",
                "args": [
                    {

                    }
                ]
            },
            {
                "file": "\/UnitTest\/PHPUnit.php",
                "line": 116,
                "function": "run",
                "class": "PHPUnit",
                "type": "->",
                "args": [

                ]
            },
            {
                "file": "\/UnitTest\/PHPUnit.php",
                "line": 212,
                "function": "__tostring",
                "class": "PHPUnit",
                "type": "->",
                "args": [

                ]
            }
        ],
        "message": "false assertionzzzzz.\nFailed asserting that <boolean:false> is true."
    },
    {
        "event": "test",
        "suite": "TagTestCase",
        "test": "TagTestCase::test_two",
        "status": "pass",
        "time": 0.00182914733887,
        "trace": [

        ],
        "message": ""
    }
]

編集:これらは私が探求してきた道です-多分あなたはより良い探検家です..役立つかもしれない3つの可能な道:

  • Php 5.2と5.3のjson_decode()の違いは何ですか?彼らは何を変えましたか?
  • PHPUnitのJSONを使用している他の人と、その解析方法。
  • 変数に含めると、画面に出力してjson_decode()にコピーすると何が変わりますか

どんな助けでも大歓迎です(!)。

ありがとう!マット

11
Matt

なんて恐ろしいデバッグセッション..まあ良いニュースがあります..私はそれを理解しました..

AJAXを使用してFirebugでログを記録し始めました...そしてjson_decode(またはeval)は&quot;を処理できないことがわかりました。これはPHPUnitが送り返すものです。 (セバスチャンに来てください!)、それを修正するには:

$json = str_replace('&quot;', '"', $json);

今、私はそれらが同じだと思いました..多分誰かが私を啓発することができます..

21
Matt

昨日、そのエラーのチェックと修正に2時間費やしましたが、最終的に、デコードしたいJSON文字列に「\」スラッシュがあることがわかりました。したがって、論理的に行うべきことは、ストリップスラッシュ関数または別のPLに類似したものを使用することです。

もちろん、最良の方法は、この変数を出力してjson_decodeの後にどうなるかを確認することです。nullの場合は、 json_last_error() 関数を使用して、整数を返すエラーを判別することもできますが、ここに説明されているもの:

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

私の場合、json_last_error()の出力を数値4として取得したので、JSON_ERROR_SYNTAX。それから私は行って、私が変換したいと思っていて、それが最後の行にあった文字列自体を調べました:

'\'title\' error ...'

その後は本当に簡単な修正です。

$json = json_decode(stripslashes($response));
if (json_last_error() == 0) { // you've got an object in $json}
17
Matija

私が使用するとき:

phpunit --log-json file.json <test_file>

(PHPUnit 3.4.13を使用)、作成するファイルに有効なJSONが含まれていないようです。

jsonファイルには次のような「json」が含まれています。

{...}{...}{...}{...}

私が期待するものの代わりに:

[{...},{...},{...},{...}]

あなたが見ているのと同じ問題であるかどうかはわかりませんが、質問のサンプルJSON出力は、私が見ているものよりも有効であるように見えます。

欠落しているコンマと角かっこを追加したら、PHP 5.2.10またはPHP 5.3.2。)でjson_decode()を使用して解析できます。

4
Keith Minkler

これを試してください。問題はこのhtml_entity_decode($ your value);です。

 if(get_magic_quotes_gpc()){
   $param = stripslashes($row['your column name']);
 }else{
   $param = $row['your column name'];
}


$param = json_decode(html_entity_decode($param),true);
 $json_errors = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
);
 echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
print_r($param);
2

これを使用する必要があります

$jsonstring = stripslashes(str_replace('\"', '"', $jsonstring));

私はこれをPHP 5.3でテストしました

1
Balibia

送信する前にデータベースの文字セットを設定できます-私の側で解決された問題:

$sql = $mysqli->set_charset("utf8");
0
jQuery

aLLでエラー報告を設定しようとすると、json_decode()は、変換が失敗したオフセットで通知を受け取るはずです。

0
shadow_of__soul

PHP 7.なので、json_decode関数は新しいJSON_THROW_ON_ERRORオプションを受け入れ、エラー時にnullを返す代わりにjson_decodeが例外をスローできるようにします。


例:

try {  
  json_decode("{", false, 512, JSON_THROW_ON_ERROR);  
}  
catch (\JsonException $exception) {  
  echo $exception->getMessage(); // displays "Syntax error"  
}
0
dtar

Json出力形式に関するSebastianからの有用な投稿

https://github.com/sebastianbergmann/phpunit/issues/142

キースの提案を使用すると、データを正しく解析できます

0
Carlton

PHPバージョン5.14.12でこの動作に気づきましたが、他のバージョンでも同様である可能性があります。
file_get_contentsを使用してJSON文字列をjson_decode関数にロードする場合、正しく機能する前に、BOM文字を削除する必要がありました。つまりUTF-8 EF BBBFの場合です。
2つの文字列の長さ(ハードコードされた変数と渡された変数)を比較します。それらが同じでない場合は、これらの文字が原因である可能性があります。

0
user3633397