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 между прочим) не может обрабатывать "
, что и отправляет PHPUnit (Come on Sebastian!), поэтому исправить:
$json = str_replace('"', '"', $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"
}