У меня проблема с моим JSON. Он корректно работает в PHP 5.3 (поэтому я не могу использовать json_last_error ()), и он успешно возвращается, когда я скопирую строку явно в json_decode (json_decode ('{…}'). Он возвращает только null, когда я пропускаю результат как переменная, и я использую php 5.2, для чего мне это нужно.
Вывод происходит из записи JSON в PHPUnit:
[ { "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": "" } ]
EDIT: Это пути, которые я изучал – возможно, вы лучший исследователь. Три возможных пути, которые могли бы помочь:
Любая помощь будет очень (!) Оценена.
Благодаря! Matt
Какая УДОБНАЯ отладочная сессия. Хорошо, есть хорошие новости. Я понял это.
Я начал смотреть на него с помощью AJAX и записывать его с помощью Firebug … и получается, что json_decode (или eval между прочим) не может обрабатывать "
, и это то, что PHPUnit отправляет обратно (Приходите на Себастьяна!), чтобы исправить это:
$json = str_replace('"', '"', $json);
Теперь я думал, что они такие же … может, кто-то может просветить меня ..
Вчера я потратил 2 часа на проверку и исправление этой ошибки, наконец, я обнаружил, что в строке JSON, которую я хотел декодировать, были «\» слэши. Итак, логично, что нужно использовать функцию stripslashes или что-то похожее на разные PL.
Конечно, лучший способ – это порог, чтобы напечатать этот var out и посмотреть, что он будет после json_decode, если он равен null, вы также можете использовать функцию json_last_error (), чтобы определить ошибку, в которой он вернет целое число, но здесь описаны те int:
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-вывода в вопросе выглядит более достоверным, чем то, что я вижу.
После добавления отсутствующих запятых и скобок он может быть проанализирован с помощью json_decode () на PHP 5.2.10 или PHP 5.3.2.
Попробуйте эту проблему, это html_entity_decode ($ ваше значение);
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
попробуйте установить отчет об ошибках во ВСЕХ, json_decode () должен предоставить вам уведомление в смещении, где преобразование завершается с ошибкой.
Полезное сообщение от Себастьяна о формате json
https://github.com/sebastianbergmann/phpunit/issues/142
Использование предложения Кейта позволит правильно анализировать данные
Я замечаю это поведение с PHP версии 5.14.12, и это может быть и для других версий.
При использовании file_get_contents для загрузки строки JSON в функцию json_decode мне пришлось снимать символы спецификации, то есть для UTF-8 EF BB BF, прежде чем она будет работать должным образом.
Сравните длины ваших двух строк – жестко закодированные по сравнению с переданными в переменной – если они не совпадают, эти символы могут быть виновниками.
Вы можете установить кодировку базы данных перед отправкой – решить проблемы на моем конце:
$sql = $mysqli->set_charset("utf8");