Подтвердить что ты не робот

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")

В чем может быть причина?

4b9b3361

Ответ 1

EDIT: Просто сделал быструю проверку строки, предоставленной OP. Маленьким "символом" перед фигурной скобкой является UTF-8 B (yte) O (rder) M (ark) 0xEF 0xBB 0xBF. Я не знаю, почему эта последовательность байтов отображается как здесь.

По существу система, с которой вы получаете данные, отправляет ее в UTF-8 с помощью спецификации, предшествующей данным. Вы должны удалить первые три байта из строки, прежде чем бросать ее в json_decode() (a substr($string, 3) будет делать).

string(62) "{"action":"set","user":"123123123123","status":"OK"}"
            ^
            |
            This is the UTF-8 BOM

Как Kuroki Kaze, этот символ, несомненно, является причиной того, что json_decode терпит неудачу. Строка в заданной форме не является корректной структурой JSON (см. RFC 4627)

Ответ 2

Ну, у меня была аналогичная проблема, и проблемы были магическими кавычками PHP на сервере... вот мое решение:

if(get_magic_quotes_gpc()){
  $param = stripslashes($_POST['param']);
}else{
  $param = $_POST['param'];
}
$param = json_decode($param,true);

Ответ 3

Распечатайте последнюю ошибку json при отладке.


json_decode( $so, true, 9 );
$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;
Также используйте функцию json.stringify(), чтобы дважды проверить ваш синтаксис JSON.

Ответ 4

Ни один из вышеперечисленных решений не работал у меня, но html_entity_decode($json_string) сделал трюк

Ответ 5

Попробуйте это

$foo = utf8_encode($foo);
$data = json_decode($foo, true);

Ответ 6

убедитесь, что если вы отправили данные по POST/GET, сервер не выполнил кавычки

$my_array = json_decode(str_replace ('\"','"', $json_string), true);

Ответ 7

"{"action":"set","user":"123123123123","status":"OK"}"

Этот маленький апостроф в начале - что это? Первый символ после двойной кавычки.

Ответ 8

У меня была аналогичная проблема на реальном сайте. На моем локальном сайте он работал нормально. Для исправления того же я просто добавил код ниже

json_decode(stripslashes($_GET['arr']));

Ответ 9

Я просто положил это

$result = mb_convert_encoding($result,'UTF-8','UTF-8'); 
    $result = json_decode($result);

и он работает

Ответ 10

Вчера я потратил 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}

Ответ 11

У меня была такая проблема с хранением json-string в MySQL. Не знаю, почему, но используя проблему htmlspecialchars_decode berofe json_decode.

Ответ 12

Не все эти решения работали для меня. В конечном итоге DID проверил кодировку строк, сохранив ее в локальном файле и открыв с помощью Notepad ++. Я узнал, что это "UTF-16", поэтому я смог преобразовать его так:

$str = mb_convert_encoding($str,'UTF-8','UTF-16');

Ответ 13

Возможно, вы используете вещь как $ ${: эти символы должны быть указаны.

Ответ 14

У меня была эта проблема, когда я вызывал метод мыла для получения моих данных, а затем возвращал строку json, когда я пытался сделать json_decode, я просто продолжаю получать нуль.

Поскольку я использовал nusoap для вызова мыла, я попытался просто вернуть строку json, и теперь я могу сделать json_decode, так как я действительно не хотел получать мои данные с помощью SOAP-вызова, то, что я сделал, это добавить ob_start() до include 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);

Ответ 15

Я не знаю. Почему? Но эта работа:

$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() - Не работает

Ответ 16

Проверьте кодировку вашего файла. Я использовал netbeans и должен был использовать кодировку iso windows 1252 для старого проекта, а netbeans использовал эту кодировку с тех пор для каждого нового файла. Затем json_decode возвращает NULL. Сохранение файла снова с помощью кодировки UTF-8 решило проблему для меня.

Ответ 17

В Notepad ++ выберите "Кодирование" (из верхнего меню), а затем убедитесь, что выбран "Кодировать в UTF-8".

Здесь будут отображаться любые символы, которые не должны быть в вашем json, что приведет к ошибке json_decode.

Ответ 18

Попробуйте использовать json_encode в строке до использования json_decode... idk, если будет работать для вас, но это было для меня... Я использую laravel 4 ajaxing через параметр маршрута.

$username = "{username: john}";
public function getAjaxSearchName($username)
{
    $username = json_encode($username);
    die(var_dump(json_decode($username, true)));
}

Ответ 19

Вам следует попробовать 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 use the data

Ответ 20

У меня была аналогичная проблема, она работала после добавления "одиночных кавычек" вокруг строки json_encode. Следуя из файла js:

var myJsVar  = <?php echo json_encode($var); ?> ;    -------> NOT WORKING  
var myJsVar = '<?php echo json_encode($var); ?>' ;    -------> WORKING

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