PHP
[PHP] json_decode이 안될 때, json_last_error() 확인하기
dev-mint
2022. 3. 10. 14:55
json 형식의 문자열을 배열로 파싱해볼게요.
<?php
$json_string = "{"text":"안녕하세요. 개발자 민트의 블로그 입니다.
부족하지만 같이 개발 공부 해요! ","date":"2022-03-10"}";
$decode = json_decode($json_string, true);
print_r($decode); // 값이 출력되지 않음
echo gettype($decode); // NULL
제대로 파싱했나 print_r()로도 출력되지 않고, 타입을 찍어보니 NULL이 나옵니다. 😅
내가 뭘 잘못한 것이지..?
이럴때 확인해볼 수 있는 함수가 있습니다.
json_last_error
https://www.php.net/manual/en/function.json-last-error.php
Returns the last error (if any) occurred during the last JSON encoding/decoding, which did not specify
JSON_THROW_ON_ERROR.
JSON_THROW_ON_ERROR를 지정하지 않은 마지막 JSON 인코딩/디코딩 중에 발생한 마지막 오류를 반환합니다.
JSON_THROW_ON_ERROR는 PHP 7.3이상에서 제공되는 기능으로
json 인코딩, 디코딩시에 옵션 값으로 추가하여 오류를 처리할 수 있습니다.
저는 현재 7.1을 사용중이기 때문에 사용불가!
json_last_error()를 사용하여 오류를 확인해 보겠습니다.
반환되는 데이터는 int형입니다.
<?php
/*
The above outputs :
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
6 JSON_ERROR_RECURSION
7 JSON_ERROR_INF_OR_NAN
8 JSON_ERROR_UNSUPPORTED_TYPE
*/
$json_string = '{"text":"안녕하세요. 개발자 민트의 블로그 입니다.
부족하지만 같이 개발 공부 해요! ","date":"2022-03-10"}';
$decode = json_decode($json_string, true);
// 오류 찍어보기
$error = json_last_error();
echo $error; // 3 : JSON_ERROR_CTRL_CHAR
// 또는
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
문자열에서 오류..?
무엇이 잘못되었지 하고 천천히 보니까 제가 만든 json 문자열에 줄바꿈이 들어가있더라구요 ^^;
줄바꿈을 없애줍니다.
<?php
$json_string = str_replace(array("\n", "\r"), ' ', $json_string); // 개행문자 제거
이번에는 정상적으로 출력되고, json_last_error()로 0으로 반환되는걸 확인!!
json으로 인코딩/디코딩이 잘 안될때 사용해보시면 될 것 같습니다.