development

json_decode는 웹 서비스 호출 후 NULL을 반환합니다.

big-blog 2020. 12. 13. 10:10
반응형

json_decode는 웹 서비스 호출 후 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를 사용합니다. 웹 서비스 응답의 Content-Type : "text/html; charset=utf-8"(도 사용하려고 시도 함 "application/json; charset=utf-8")

이유가 무엇일까요?


편집 : OP에서 제공하는 문자열을 빠르게 검사했습니다. 중괄호 앞의 작은 "문자"는 UTF-8 B (yte) O (rder) M (ark) 0xEF 0xBB 0xBF 입니다. 이 바이트 시퀀스가 여기 와 같이 표시되는 이유를 모르겠습니다 .

기본적으로 데이터를 가져 오는 시스템은 데이터 앞에 BOM이있는 UTF-8로 인코딩 된 데이터를 보냅니다. 던지기 전에 문자열에서 처음 3 바이트를 제거해야합니다 json_decode()(a substr($string, 3)will do).

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

마찬가지로 구로키 바람이 발견,이 문자는 반드시 이유입니다 json_decode실패는. 지정된 형식의 문자열이 JSON 형식 구조가 아닙니다 ( RFC 4627 참조 ).


글쎄, 비슷한 문제가 있었고 문제는 서버의 PHP 마술 따옴표였습니다 ... 여기 내 해결책이 있습니다.

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

디버깅 할 때 마지막 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 구문을 다시 확인하십시오.


위의 솔루션 중 어느 것도 나를 위해 일 html_entity_decode($json_string)하지 않았지만 트릭을 수행했습니다.


이 시도

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

POST / 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 문자열이 '\'슬래시라는 것을 발견했습니다. 따라서 논리적으로해야 할 일은 stripslash 기능이나 다른 PL과 유사한 기능을 사용하는 것입니다.

물론 가장 좋은 방법은이 변수를 출력하고 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}

MySQL의 스토리지 json-string에 그런 문제가 있습니다. 이유는 모르지만 htmlspecialchars_decode berofe json_decode를 사용하면 문제가 해결되었습니다.


이러한 솔루션 중 어느 것도 나를 위해 일했습니다. 결국 DID가 작동하는 것은 문자열 인코딩을 로컬 파일에 저장하고 메모장 ++로 열어 확인하는 것입니다. 나는 그것이 'UTF-16'이라는 것을 알았으므로 다음과 같이 변환 할 수있었습니다.

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

아마도 다음과 같이 사용할 수 있습니다 $ ${.이 문자는 인용되어야합니다.


이 문제가 발생했습니다. soap 메서드를 호출하여 데이터를 얻은 다음 json 문자열을 반환 할 때 json_decode를 시도 할 때 계속 null이 발생합니다.

nusoap을 사용하여 soap 호출을 수행했기 때문에 json 문자열을 반환하려고했고 이제 json_decode를 수행 할 수있었습니다. SOAP 호출로 데이터를 가져와야했기 때문에 nusoap을 포함하기 전에 ob_start ()를 추가했습니다. id는 json 문자열을 생성하고 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);

왜 그런지 모르겠어요? 그러나이 작업 :

$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 ()없이-작동하지 않습니다.


Check the encoding of your file. I was using netbeans and had to use iso windows 1252 encoding for an old project and netbeans was using this encoding since then for every new file. json_decode will then return NULL. Saving the file again with UTF-8 encoding solved the problem for me.


In Notepad++, select Encoding (from the top menu) and then ensure that "Encode in UTF-8" is selected.

This will display any characters that shouldn't be in your json that would cause json_decode to fail.


Try using json_encode on the string prior to using json_decode... idk if will work for you but it did for me... I'm using laravel 4 ajaxing through a route param.

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

You should try out json_last_error_msg(). It will give you the error message and tell you what is wrong. It was introduced in 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

i had a similar problem, got it to work after adding '' (single quotes) around the json_encode string. Following from my js file:

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

just thought of posting it in case someone stumbles upon this post like me :)

참고URL : https://stackoverflow.com/questions/689185/json-decode-returns-null-after-webservice-call

반응형