json_decode Webcoder çağrısından sonra null döndürür

16 Cevap php

Orada json_encode ve json_decode ile garip bir davranıştır ve ben bir çözüm bulamıyorum:

Benim php uygulama bir php web hizmeti çağırır. Webcoder şöyle json döndürür:

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

şimdi benim uygulamada json çözmek istiyorum:

$data = json_decode($foo, true)

ama döner NULL:

var_dump($data):
NULL

I use php5. The Content-Type of the response from the webservice: "text/html; charset=utf-8" (also tried to use "application/json; charset=utf-8")

Bunun nedeni ne olabilir?

16 Cevap

EDIT: Just did some quick inspection of the string provided by the OP. The small "character" in front of the curly brace is a UTF-8 B(yte) O(rder) M(ark) 0xEF 0xBB 0xBF. I don't know why this byte sequence is displayed as  here.

Esasen sizden verileri aquire sistemi verileri önceki bir BOM ile UTF-8 olarak kodlanmış gönderir. Eğer json_decode() (a substr($string, 3) yapacak) içine atmak önce dizeden ilk üç bayt kaldırmanız gerekir.

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

Kuroki Kaze keşfettiği gibi, bu karakter kesinlikle json_decode başarısız nedeni de budur. Onun verilen formda dize (RFC 4627 bakınız) doğru bir JSON format yapı değildir

Eh, ben de benzer bir sorunu vardı ve sorunlar burada benim çözüm ... sunucu PHP sihirli tırnak oldu:

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

Yukarıdaki çözümler hiçbiri benim için çalıştı, ama html_entity_decode($json_string) hile yaptı

Bu deneyin

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

POST ile veri gönderirse / sunucu tırnak kaçmak değil GET emin olun

$my_array = json_decode(str_replace ('\"','"', $json_string), true);
"{"action":"set","user":"123123123123","status":"OK"}"

Başlangıçta bu küçük kesme işareti - bu nedir? Doublequote sonra ilk sembolüdür.

Ben canlı bir sitede benzer bir sorun vardı. Benim yerel sitede gayet iyi çalışıyordu. Aynı sabitleme için ben sadece aşağıdaki kodu ekledim

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

Ben sadece bu koymak

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

ve çalışıyor

Ben sadece boş almaya devam json_decode yapmaya çalıştım ben, benim veri elde etmek için bir sabun yöntemini çağırarak, ve sonra bir json dize döndürmek zaman ben, bu sorunu olmamdı.

Ben sadece json dize döndürmek için çalıştı sabun arama yapmak için NuSOAP kullanıyordum ve ben gerçekten bir SOAP çağrısı ile benim veri almak için neaded beri şimdi ben, bir json_decode yapabileceğini beri, ne yaptım, NuSOAP dahil önce () ob_start eklemek oldu id benim davetim genereate json dize, ve sonra benim json dize dönmeden önce MY SORUN VAR SABİT) (ob_end_clean yoktu ve yoktu :)

ÖRNEK

//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);

I don't know Why? But this work:

$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 olmadan () - iş yapmayın

Belki de "$", "$ {" Bu karakter alıntı olması gerektiği gibi bir şey kullanın.

Dosyanızın kodlamasını kontrol edin. Ben netbeans kullanarak ve eski bir proje için iso pencereler 1252 kodlamasını kullanmak ve netbeans her yeni dosya için o zamandan beri bu kodlamayı kullanan vardı. json_decode sonra NULL dönecektir. UTF-8 kodlaması ile yeniden dosya kaydetme benim için sorun çözüldü.

Dün son olarak ben çöz istedim JSON dizesinde '\' bölü olduğunu bulundu hata kontrol ve sabitleme 2 saat geçirdim. Bu yüzden yapılacak en mantıklı şey stripslashes fonksiyonunu veya farklı PL benzer bir şey kullanmaktır.

Tabii ki en iyi yolu, bu dışarı yerdedir baskı ve json_decode sonra ne hale geldiğini görmek, bu null olup olmadığını aynı zamanda tamsayı dönecektir hatayı belirlemek için json_last_error() işlevini kullanabilirsiniz ama burada bu tarif int oldukları pervazına :

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

Benim durumumda sayısına 4 olarak json_last_error çıkışı () var bu yüzden JSON_ERROR_SYNTAX olduğunu. Sonra gitti ve ben dönüştürmek istedim dize o kendini içine bir göz atın ve bu son satırda vardı:

'\'title\' error ...'

Bu gerçekten sadece kolay bir düzeltme sonra.

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

Sonra Notepad + +, (üst menüden) seçin Kodlama ve "UTF-8 Encode" seçili olduğundan emin olarak.

Bu json_decode başarısız olmasına neden olur sizin json olmamalı herhangi bir karakter gösterecektir.

i, benzer bir sorunu vardı o'' json_encode dize etrafında (tek tırnak) eklendikten sonra çalışmak lazım. Benim js dosyasından aşağıdaki:

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

sadece birisi benim gibi bu yazı stumbles durumda ilanıyla düşündüm :)