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

 

PHP: json_last_error - Manual

use this code with mb_convert_encoding, you can json_encode some corrupt UTF-8 chars    function safe_json_encode($value, $options = 0, $depth = 512) {        $encoded = json_encode($value, $options, $depth);        if ($encoded === false && $val

www.php.net

 

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으로 인코딩/디코딩이 잘 안될때 사용해보시면 될 것 같습니다.