본문으로 건너뛰기
jsonbeautifiers
한국어
PHP 상수 이름과 메시지는 PHP 매뉴얼에서 가져왔습니다.

json_decode() returns NULL

PHP는 기본적으로 잘못된 JSON에 예외를 던지지 않습니다. json_decode는 그냥 NULL을 돌려주는데, 그건 입력이 "null"일 때의 정당한 결과이기도 해서, 반환값만으로는 실패와 성공을 구별할 수 없습니다. 첫 번째 할 일은 무엇이 잘못됐는지 PHP가 말하게 만드는 것입니다.

JSON을 붙여넣고 어디서 깨지는지 정확히 확인하기

입력

붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기

실제 원인

어느 쪽이 답인 경우가 많은지, 그 순서대로 정리했습니다.

  1. 01 아직 오류 메시지 자체가 없음

    디코딩 직후에 json_last_error_msg()를 부르거나, JSON_THROW_ON_ERROR 플래그를 넘겨 JsonException이 던져지게 하세요. 둘 중 아무것도 없으면 눈 감고 디버깅하는 셈이고, 이 문제가 그렇게 오래 걸리는 이유가 그것입니다.

    깨지는 예

    $data = json_decode($body, true);
    if ($data === null) { /* why? */ }

    되는 예

    $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
    // or
    $data = json_decode($body, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new RuntimeException(json_last_error_msg());
    }
  2. 02 파일 앞의 UTF-8 바이트 순서 표식

    PHP에서는 고전적인 함정입니다. file_get_contents가 BOM을 그대로 돌려주고 json_decode는 그것을 거부합니다. 앞의 세 바이트가 EF BB BF라면 떼어 내세요.

  3. 03 잘못된 UTF-8. JSON_ERROR_UTF8이 됨

    "Malformed UTF-8 characters, possibly incorrectly encoded"는 보통 데이터가 Latin-1 데이터베이스 컬럼에서 왔다는 뜻입니다. 디코딩 전에 mb_convert_encoding으로 변환하세요.

  4. 04 JSON 앞에 출력된 warning이나 notice

    응답 본문보다 앞선 출력은 전부 본문 안으로 들어갑니다. 운영에서는 display_errors를 끄고 로그에 남기세요.

  5. 05 기본 한도보다 깊은 중첩. JSON_ERROR_DEPTH가 됨

    json_decode의 기본 깊이는 512입니다. 데이터가 정말 그만큼 깊다면 세 번째 인자를 올리세요.

자주 묻는 질문

JSON_ERROR 상수에는 어떤 것들이 있나요?
JSON_ERROR_NONE(0), JSON_ERROR_DEPTH(1, 최대 스택 깊이 초과), JSON_ERROR_STATE_MISMATCH(2), JSON_ERROR_CTRL_CHAR(3, 예기치 않은 제어 문자 발견), JSON_ERROR_SYNTAX(4, 문법 오류, 잘못된 JSON), JSON_ERROR_UTF8(5, 잘못된 UTF-8 문자), 그리고 JSON_ERROR_RECURSION, JSON_ERROR_INF_OR_NAN, JSON_ERROR_UNSUPPORTED_TYPE, JSON_ERROR_INVALID_PROPERTY_NAME, JSON_ERROR_UTF16, JSON_ERROR_NON_BACKED_ENUM이 있습니다.
결과로서의 NULL과 실패로서의 NULL은 어떻게 구별하나요?
json_last_error() === JSON_ERROR_NONE이면 디코딩이 성공한 것이고, 돌아온 NULL은 진짜 값 null입니다. 다른 코드가 나오면 실패한 것입니다.

지금 고치기

위의 도구에 페이로드를 붙여넣거나, 이 일을 위해 만들어진 도구로 바로 가세요.

문법 오류 찾기