json_decode возвращает NULL после вызова webservice

Существует странное поведение с 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" )

Что может быть причиной?

Solutions Collecting From Web of "json_decode возвращает NULL после вызова webservice"

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 

просто подумал о том, чтобы опубликовать его, если кто-то наткнется на этот пост, как я 🙂