Существует странное поведение с json_encode
и json_decode
и я не могу найти решение:
Мое приложение php вызывает веб-службу php. Webservice возвращает json, который выглядит так:
var_dump($foo): string(62) "{"action":"set","user":"123123123123","status":"OK"}"
теперь мне нравится декодировать json в моем приложении:
$data = json_decode($foo, true)
но он возвращает NULL
:
var_dump($data): NULL
Я использую php5. Content-Type ответа от webservice: "text/html; charset=utf-8"
(также пытался использовать "application/json; charset=utf-8"
)
Что может быть причиной?
EDIT: Просто сделал быструю проверку строки, предоставленной OP. Маленьким «символом» перед фигурной скобкой является UTF-8 B (yte) O (rder) M ( 0xEF 0xBB 0xBF
) 0xEF 0xBB 0xBF
. Я не знаю, почему эта последовательность байтов отображается здесь.
По сути, система, с которой вы получаете данные, отправляет ее в UTF-8 с помощью спецификации, предшествующей данным. Вы должны удалить первые три байта из строки, прежде чем бросать ее в json_decode()
(будет использоваться substr($string, 3)
).
string(62) "{"action":"set","user":"123123123123","status":"OK"}" ^ | This is the UTF-8 BOM
Как выяснил Kuroki Kaze , этот персонаж наверняка является причиной json_decode
. Строка в заданной форме не является корректной структурой JSON (см. RFC 4627 )
Ну, у меня была аналогичная проблема, и проблемы были магическими цитатами PHP на сервере … вот мое решение:
if(get_magic_quotes_gpc()){ $param = stripslashes($_POST['param']); }else{ $param = $_POST['param']; } $param = json_decode($param,true);
Распечатайте последнюю ошибку json при отладке.
json_decode ($ so, true, 9); $ json_errors = массив ( JSON_ERROR_NONE => «Произошла ошибка», JSON_ERROR_DEPTH => 'Максимальная глубина стека превышена, JSON_ERROR_CTRL_CHAR => 'Ошибка управления символом, возможно некорректно закодированная', JSON_ERROR_SYNTAX => «Синтаксическая ошибка», ); echo 'Последняя ошибка:', $ json_errors [json_last_error ()], PHP_EOL, PHP_EOL;
Также используйте функцию json.stringify (), чтобы дважды проверить ваш синтаксис JSON.
Ни одно из вышеперечисленных решений не работало для меня, но html_entity_decode($json_string)
сделал трюк
Попробуй это
$foo = utf8_encode($foo); $data = json_decode($foo, true);
убедитесь, что если вы отправили данные по POST / 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.
Конечно, лучший способ – это порог, чтобы напечатать этот 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}
У меня была такая проблема с хранением json-string в MySQL. Не знаю, почему, но используя проблему htmlspecialchars_decode berofe json_decode.
Не для меня эти решения работали. В конечном итоге DID проверил кодировку строк, сохранив ее в локальном файле и открыв с помощью Notepad ++. Я узнал, что это «UTF-16», поэтому я смог преобразовать его так:
$str = mb_convert_encoding($str,'UTF-8','UTF-16');
Возможно, вы используете вещь как $
${
: эти символы должны быть указаны.
У меня была эта проблема, когда я вызывал метод мыла для получения моих данных, а затем возвращал строку json, когда я пытался сделать json_decode, я просто продолжаю получать нуль.
Поскольку я использовал nusoap для вызова мыла, я попытался просто вернуть строку json, и теперь я могу сделать json_decode, так как я действительно не хотел получать мои данные с SOAP-вызовом, то, что я сделал, это добавить ob_start (), прежде чем включить nusoap, id сделал мой вызов genereate json string, а затем, прежде чем возвращать строку json, я сделал ob_end_clean () и GOT MY PROBLEM FIXED 🙂
ПРИМЕР
//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 ++ выберите «Кодирование» (из верхнего меню), а затем убедитесь, что выбран «Кодировать в UTF-8».
Это отобразит любые символы, которые не должны быть в вашем json, что приведет к сбою json_decode
.
Попробуйте использовать json_encode в строке до использования json_decode … idk, если вы будете работать для вас, но это было для меня … Я использую laravel 4 ajaxing через параметр route.
$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
просто подумал о том, чтобы опубликовать его, если кто-то наткнется на этот пост, как я 🙂