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

Ответ 1

Какая сессия отладки HORRENDOUS... ну там хорошие новости.. Я понял это.

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

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

Теперь я думал, что они такие же... может кто-то может просветить меня..

Ответ 2

Вчера я потратил 2 часа на проверку и исправление этой ошибки, наконец, я обнаружил, что в строке JSON, которую я хотел декодировать, были "\" косые черты. Таким образом, логическая задача - использовать функцию stripslashes или что-то подобное различным PL.

Конечно, лучшим способом является печать этого var var и посмотреть, что он делает после 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}

Ответ 3

Когда я использую:

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.

Ответ 4

Попробуйте, это проблема в этом 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);

Ответ 5

Вы должны использовать этот

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

Я тестировал это с помощью PHP 5.3

Ответ 6

попытайтесь установить отчет об ошибках во ВСЕХ, json_decode() должен предоставить вам уведомление в смещении, где преобразование завершается неудачно.

Ответ 7

Полезное сообщение от Себастьяна о формате выхода json

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

Использование предложения Keith позволит правильно анализировать данные

Ответ 8

Я замечаю это поведение с PHP версии 5.14.12, и это может быть и для других версий.
При использовании file_get_contents для загрузки строки JSON в функцию json_decode мне пришлось вычеркивать символы спецификации, т.е. Для UTF-8 EF BB BF, прежде чем она будет работать правильно.
Сравните длины ваших двух строк - жестко закодированные и переданные в переменной - если они не совпадают, эти символы могут быть виновниками.

Ответ 9

Вы можете установить кодировку базы данных перед отправкой - решить проблемы на моем конце:

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

Ответ 10

Начиная с PHP 7.3, функция json_decode будет принимать новую опцию JSON_THROW_ON_ERROR, которая позволит json_decode генерировать исключение вместо возврата null при ошибке.


Пример:

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