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
'development' 카테고리의 다른 글
숫자 (숫자 및 소수점) 만 입력하도록 허용하는 방법은 무엇입니까? (0) | 2020.12.13 |
---|---|
PHP에서 숫자 기호 변경? (0) | 2020.12.13 |
“Invariant Violation : Application AwesomeProject가 등록되지 않았습니다.”정적 jsbundle로 iOS 장치 용으로 빌드 할 때 (0) | 2020.12.13 |
이 C ++ for 루프의 실행 시간에 중요한 차이가있는 이유는 무엇입니까? (0) | 2020.12.13 |
스토리 보드의 색상이 UIColor와 일치하지 않습니다. (0) | 2020.12.13 |