json_decode () возвращает нулевые проблемы - PullRequest
11 голосов
/ 24 июня 2010

У меня проблема с моим JSON.Он работает правильно возвращается в PHP 5.3 (поэтому я не могу использовать json_last_error ()), и он успешно возвращается, когда я явно копирую строку в json_decode (json_decode ('{...}'). Он возвращает только ноль, когда я передаюрезультат в виде переменной, и я использую 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": ""
    }
]

РЕДАКТИРОВАТЬ: Этопути, я изучал - может быть, вы лучший исследователь .. Три возможных пути, которые могли бы помочь:

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

Любая помощь будет очень (!) Признательна.

Спасибо! Мэтт

Ответы [ 10 ]

20 голосов
/ 24 июня 2010

Какая УЖАСНАЯ сессия отладки ... ну, есть хорошие новости .. Я понял это ...

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

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

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

17 голосов
/ 08 августа 2013

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

Конечно, лучший способ - это распечатать этот var и посмотреть, что он станет после json_decode, если он нулевой, вы можететакже используйте функцию 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

в моем случае, как я получил выходной номер1019 * 4 , поэтому JSON_ERROR_SYNTAX .Затем я пошел и посмотрел на строку, которую я сам хотел преобразовать, и она имела в последней строке:

'\'title\' error ...'

После этого действительно просто исправить.

$json = json_decode(stripslashes($response));
if (json_last_error() == 0) { // you've got an object in $json}
4 голосов
/ 24 июня 2010

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

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.

2 голосов
/ 01 ноября 2015

Попробуйте, проблема в следующем 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);
1 голос
/ 20 июля 2013

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

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

Я проверял это с PHP 5.3

0 голосов
/ 01 мая 2019

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


Пример:

try {  
  json_decode("{", false, 512, JSON_THROW_ON_ERROR);  
}  
catch (\JsonException $exception) {  
  echo $exception->getMessage(); // displays "Syntax error"  
}
0 голосов
/ 07 марта 2016

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

$sql = $mysqli->set_charset("utf8");
0 голосов
/ 26 июня 2014

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

0 голосов
/ 07 марта 2012

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

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

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

0 голосов
/ 24 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...