json_decode () возвращает null проблемы

У меня проблема с моим 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: Это пути, которые я изучал – возможно, вы лучший исследователь. Три возможных пути, которые могли бы помочь:

  • Чем отличается json_decode () в php 5.2, то 5.3? что они изменили?
  • Кто-то еще использует JSON из PHPUnit и как они анализируют его.
  • Что изменится, когда вы имеете его в переменной или распечатываете его на экране и копируете его в json_decode ()

Любая помощь будет очень (!) Оценена.

Благодаря! Matt

Какая УДОБНАЯ отладочная сессия. Хорошо, есть хорошие новости. Я понял это.

Я начал смотреть на него с помощью AJAX и записывать его с помощью Firebug … и получается, что json_decode (или eval между прочим) не может обрабатывать &quot; , и это то, что PHPUnit отправляет обратно (Приходите на Себастьяна!), чтобы исправить это:

 $json = str_replace('&quot;', '"', $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");