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つの可能な道:
どんな助けでも大歓迎です(!)。
ありがとう!マット
なんて恐ろしいデバッグセッション..まあ良いニュースがあります..私はそれを理解しました..
AJAXを使用してFirebugでログを記録し始めました...そしてjson_decode(またはeval)は"
を処理できないことがわかりました。これはPHPUnitが送り返すものです。 (セバスチャンに来てください!)、それを修正するには:
$json = str_replace('"', '"', $json);
今、私はそれらが同じだと思いました..多分誰かが私を啓発することができます..
昨日、そのエラーのチェックと修正に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}
私が使用するとき:
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()を使用して解析できます。
これを試してください。問題はこの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);
これを使用する必要があります
$jsonstring = stripslashes(str_replace('\"', '"', $jsonstring));
私はこれをPHP 5.3でテストしました
送信する前にデータベースの文字セットを設定できます-私の側で解決された問題:
$sql = $mysqli->set_charset("utf8");
aLLでエラー報告を設定しようとすると、json_decode()は、変換が失敗したオフセットで通知を受け取るはずです。
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"
}
Json出力形式に関するSebastianからの有用な投稿
https://github.com/sebastianbergmann/phpunit/issues/142
キースの提案を使用すると、データを正しく解析できます
PHPバージョン5.14.12でこの動作に気づきましたが、他のバージョンでも同様である可能性があります。
file_get_contentsを使用してJSON文字列をjson_decode関数にロードする場合、正しく機能する前に、BOM文字を削除する必要がありました。つまりUTF-8 EF BBBFの場合です。
2つの文字列の長さ(ハードコードされた変数と渡された変数)を比較します。それらが同じでない場合は、これらの文字が原因である可能性があります。