в JSON декодирования возвращает значение null после вызова веб-сервиса
есть странное поведение с json_encode
и json_decode
и я не могу найти решение:
мое приложение php вызывает веб-службу php. Веб-сервис возвращает JSON, который выглядит так:
var_dump($foo):
string(62) "{"action":"set","user":"123123123123","status":"OK"}"
теперь мне нравится декодировать json в моем приложении:
$data = json_decode($foo, true)
но он возвращает NULL
:
var_dump($data):
NULL
я использую php5.
Тип содержимого ответа от веб-службы:"text/html; charset=utf-8"
(также пробовал использовать "application/json; charset=utf-8"
)
что может быть причиной?
20 ответов:
EDIT: Просто сделал некоторые быстрые проверки строки, предусмотренные ОП. Маленький "символ" перед фигурной скобкой-это UTF-8 B(yte) O(rder) M (ark)
0xEF 0xBB 0xBF
. Я не знаю, почему эта последовательность байтов отображается как
здесь.по существу, система, из которой вы получаете данные, отправляет его в кодировке UTF-8 с BOM, предшествующей данным. Вы должны удалить первые три байта из строки, прежде чем бросить его в
json_decode()
(asubstr($string, 3)
будет делать).string(62) "{"action":"set","user":"123123123123","status":"OK"}" ^ | This is the UTF-8 BOM
как Kuroki Kaze обнаруженный, этот персонаж, безусловно, является причиной, почему
json_decode
не удается. Строка в заданной форме не является корректно JSON-формируемой структурой (см. RFC 4627)
Ну, у меня была аналогичная проблема, и проблемы были PHP magic quotes на сервере... вот мое решение:
if(get_magic_quotes_gpc()){ $param = stripslashes($_POST['param']); }else{ $param = $_POST['param']; } $param = json_decode($param,true);
печать последней ошибки json при отладке.
Также используйте json.преобразовать в строки() функцию, чтобы дважды проверьте ваш синтаксис JSON.
убедитесь, что если вы отправили данные по почте / GET, сервер не избежал кавычек
$my_array = json_decode(str_replace ('\"','"', $json_string), true);
"{"action":"set","user":"123123123123","status":"OK"}"
этот маленький Апостроф в начале - что это? Первый символ после удвоения.
У меня была аналогичная проблема в живом сайте. На моем местном сайте он работал нормально. Для фиксации же я просто добавил ниже код
json_decode(stripslashes($_GET['arr']));
Я просто положу это
$result = mb_convert_encoding($result,'UTF-8','UTF-8'); $result = json_decode($result);
и
вчера я потратил 2 часа на проверку и исправление этой ошибки, наконец, я обнаружил, что в строке JSON, которую я хотел декодировать, были " \ " косые черты. Поэтому логично использовать функцию stripslashes или что-то похожее на другой PL.
конечно, лучший способ-это sill, чтобы распечатать этот 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. Затем я пошел и взглянул на строку IT self, которую я хотел преобразовать, и это было в прошлом линия:
'\'title\' error ...'
после этого действительно просто легко исправить.
$json = json_decode(stripslashes($response)); if (json_last_error() == 0) { // you've got an object in $json}
У меня была такая проблема с хранением json-string в MySQL. Не знаю почему, но с помощью htmlspecialchars_decode berofe json_decode решена проблема.
не из этих решений работал для меня. Что в конечном итоге сработало, так это проверка кодировки строки, сохранив ее в локальный файл и открыв с помощью Notepad++. Я узнал, что это был "UTF-16", поэтому я смог преобразовать его следующим образом:
$str = mb_convert_encoding($str,'UTF-8','UTF-16');
У меня была эта проблема, когда я вызывал метод soap для получения моих данных, а затем возвращал строку json, когда я пытался сделать json_decode, я просто получаю null.
Так как я с помощью nusoap, чтобы сделать вызов SOAP я пытался просто вернуть JSON в строку и теперь я мог бы сделать json_decode, так как я очень neaded, чтобы получить мои данные с мыла, что я делал, было добавить ob_start() прежде чем включать nusoap, ИД мой звонок создать в JSON строку, а затем до возвращения моего в JSON строку я сделал ob_end_clean (), и получил мою проблему исправлена:)
пример
//HRT - SIGNED //20130116 //verifica se um num assoc deco é valido ob_start(); require('/nusoap.php'); $aResponse['SimpleIsMemberResult']['IsMember'] = FALSE; if(!empty($iNumAssociadoTmp)) { try { $client = new soapclientNusoap(PartnerService.svc?wsdl', array( // OPTS 'trace' => 0, 'exceptions' => false, 'cache_wsdl' => WSDL_CACHE_NONE ) ); //MENSAGEM A ENVIAR $sMensagem1 = ' <SimpleIsMember> <request> <CheckDigit>'.$iCheckDigitAssociado.'</CheckDigit> <Country>Portugal</Country> <MemberNumber">'.$iNumAssociadoDeco.'</MemberNumber> </request> </SimpleIsMember>'; $aResponse = $client->call('SimpleIsMember',$sMensagem1); $aData = array('dados'=>$aResponse->xpto, 'success'=>$aResponse->example); } } ob_end_clean(); return json_encode($aData);
Я не знаю, почему? Но эта работа:
$out = curl_exec($curl); $out = utf8_encode($out); $out = str_replace("?", "", $out); if (substr($out,1,1)!='{'){ $out = substr($out,3); } $arResult["questions"] = json_decode($out,true);
без utf8_encode() - не работает
Проверьте кодировку вашего файла. Я использовал netbeans и должен был использовать кодировку iso windows 1252 для старого проекта, и netbeans использовал эту кодировку с тех пор для каждого нового файла. json_decode возвращает значение NULL. Сохранение файла снова с кодировкой UTF-8 решило проблему для меня.
в Notepad++ выберите Encoding (в верхнем меню), а затем убедитесь, что выбран параметр "Encode in UTF-8".
это отобразит любые символы, которые не должны быть в вашем json, что вызовет
json_decode
на провал.
попробуйте использовать json_encode в строке перед использованием json_decode... idk если будет работать для вас, но это сделал для меня... Я использую laravel 4 ajaxing через маршрут param.
$username = "{username: john}"; public function getAjaxSearchName($username) { $username = json_encode($username); die(var_dump(json_decode($username, true))); }
вы должны попробовать json_last_error_msg (). Это даст вам сообщение об ошибке и сказать вам, что не так. Он был представлен в PHP 5.5.
$foo = "{"action":"set","user":"123123123123","status":"OK"}"; $data = json_decode($foo, true); if($data == null) { throw new Exception('Decoding JSON failed with the following message: ' . json_last_error_msg()); } // ... JSON decode was good => Let's use the data
У меня была аналогичная проблема, она заработала после добавления " (одинарные кавычки) вокруг строки json_encode. Следуя из моего js-файла:
var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING var myJsVar = '<?php echo json_encode($var); ?>' ; -------> WORKING
просто подумал о публикации его в случае, если кто-то наткнется на этот пост, как я :)