json_decode возвращает NULL после вызова веб-сервиса - PullRequest
56 голосов
/ 27 марта 2009

С 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. Content-Type ответа от веб-службы: "text/html; charset=utf-8" (также пытался использовать "application/json; charset=utf-8")

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

Ответы [ 20 ]

1 голос
/ 23 июня 2011

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

1 голос
/ 13 мая 2012

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

$str = mb_convert_encoding($str,'UTF-8','UTF-16');
1 голос
/ 22 июня 2013

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

0 голосов
/ 05 февраля 2015

Вы должны попробовать 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
0 голосов
/ 22 ноября 2014

Попробуйте использовать 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)));
}
0 голосов
/ 05 сентября 2013

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

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

0 голосов
/ 08 июня 2010

У меня была похожая проблема, она заработала после добавления '' (одинарные кавычки) вокруг строки json_encode. Исходя из моего файла JS:

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

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

0 голосов
/ 05 августа 2013

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

0 голосов
/ 16 января 2013

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

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

Не знаю, почему? Но эта работа:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...