2009-03-27 7 views
54

NULL Существует странное поведение с json_encode и json_decode, и я не могу найти решение:json_decode возвращается после WebService вызова

Мой PHP приложение вызывает PHP веб-службы. Вебсервис возвращает JSON, который выглядит следующим образом:

var_dump($foo): 
string(62) "{"action":"set","user":"123123123123","status":"OK"}" 

Теперь мне нравится декодировать JSON в моем приложении:

но он возвращает NULL:

var_dump($data): 
NULL 

Я использую php5. Содержимое-Тип ответа от webservice: "text/html; charset=utf-8" (также пытался использовать "application/json; charset=utf-8")

В чем причина?

ответ

60

EDIT: Только что сделал быструю проверку строки, предоставленной OP. Маленьким «персонажем» перед фигурной скобкой является UTF-8 B(yte) O(rder) M(ark)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)

+0

Я так не думаю. Это фигурная скобка. Я думаю, что каждая структура JSON должна начинаться с фигурной скобки. – schouk

+8

Нет не фигурной скобки - есть персонаж перед фигурной скобкой. –

+5

Я думаю, что форматирование SO пытается решить этот трудный вопрос. :-p –

18

Попробуйте

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

Привет Олафур, utf8_encode пишет какие-то странные символы в начале строки. utf8_decode пишет? к началу строки. Это всего лишь обходной путь, но он работает. Я уверен, что есть лучший способ: $ foo = utf8_decode ($ result-> data); json_decode (str_replace ("?", "", $ Foo), true); – schouk

+3

только это сработало для меня. спасибо – nicolast

+1

Это работает идеально для меня. Большое спасибо. – BlaShadow

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

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

+4

Я не могу найти немного апострофа. Первый символ после двойного кавычка является фигурной скобкой. – schouk

72

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

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

Большое спасибо Pablo за ваш Ответ: вы спасли меня много времени! – Alejandra

+3

Привет, приятель, не думал, что волшебные котировки вызовут такую ​​проблему, было почти в точке крика на мониторе. Cheers. – wiggles

+1

@Pablo, почему вы вызываете stripslashes (), когда get_magic_quotes_gpc() возвращает true? это сработало для меня, но после добавления (!) до get_magic_quotes_gpc, так что если get_magic_quotes_gpc не возвращает true, я вызываю spripslashes() –

32

Распечатайте последнюю ошибку 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.

+3

............. php> = 5.3 – olix20

+0

Как один из наших пользователей просто столкнулся с этим : PHP.net ** неправильно **, и это было введено с ** 5.3 **, поэтому может подтвердить @MdOliya – kaiser

+0

Это очень помогло мне! –

-4

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

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

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

+0

Это не имеет смысла, у вас будет строка, которую вам нужно будет использовать для использования с JS. Речь идет о сбое вызова json_encode. –

1

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

24

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

+0

Это работало на строку json, хранящуюся в таблице mysql utf8. Я подозреваю, что что-то происходит, когда хранится в mysql. –

+1

спасибо !! Я потратил много времени на различные решения, и это единственное, что сработало. – wwv

+0

такой же ответ работал для меня, могу я спросить, почему эта проблема? – Dashrath

7

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

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

Чувак ... ты сделал свой день. Эта проблема убила меня! –

4

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

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

+0

Это сработало для меня, не было спецификацией в кодировке UTF-8, но добавлены некоторые черты. – DannyG

1

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

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

Я с этой проблемой, когда я звоню метод мыла, чтобы получить мои данные, а затем вернуться json string, когда я пытался сделать json_decode, я просто получаю null.

Поскольку я использовал nusoap для вызова мыла, я попытался просто вернуть строку json, и теперь я могу сделать json_decode, так как я действительно не хотел получать мои данные с помощью SOAP-вызова, то, что я сделал, это добавить ob_start() перед тем включает NuSOAP, идентификатор сделал мой вызов genereate JSon строку, а затем до возвращения моего JSon строки я сделал ob_end_clean() и GOT MY ПРОБЛЕМЫ 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); 
0

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

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

3

Я просто поставить этот

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

и он работает

1

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

0

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

3

Вчера я потратил 2 часа на проверку и исправление этой ошибки. Наконец, я обнаружил, что в строке JSON, которую я хотел декодировать, были «\» косые черты. Итак, логично, что нужно использовать функцию stripslashes или что-то похожее на разные PL.

Конечно лучший способ подоконник, чтобы напечатать это Var и посмотреть, что он становится после json_decode, если это нуль вы также можете использовать 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() в качестве числа так JSON_ERROR_SYNTAX. Тогда я пошел и посмотреть в строку это сам, который я хотел, чтобы преобразовать и это было в последней строке:

'\'title\' error ...' 

После этого на самом деле просто легко исправить.

$json = json_decode(stripslashes($response)); 
if (json_last_error() == 0) { // you've got an object in $json} 
+0

Я никогда не получаю ошибки json, но этот и ваше решение работают – younes0

0

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

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

0

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

Вам следует попробовать 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 
Смежные вопросы