в 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 56

20 ответов:

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

по существу, система, из которой вы получаете данные, отправляет его в кодировке UTF-8 с BOM, предшествующей данным. Вы должны удалить первые три байта из строки, прежде чем бросить его в 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)

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

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

печать последней ошибки json при отладке. Также используйте json.преобразовать в строки() функцию, чтобы дважды проверьте ваш синтаксис JSON.

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

попробуй такое

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

убедитесь, что если вы отправили данные по почте / 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

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