백엔드 관련

JSONObject["data"] is not a string 스프링부트 자바 오류

jju_developer 2024. 6. 14. 22:53
728x90

안녕하세요 jju_developer입니다.

 

어김없이 퇴근 후 돌아왔습니다.

 

오늘은 코딩하다보면 쉽게 나타나는 오류에 대해 적어보려고 합니다~

DATA 검색을 jsonObject.getString으로 했죠?

 

바로바로 

 

Method threw 'org.json.JSONException' exception

 

JSONException이 발생한 이유는 바로 !! jsonObject.getJSONObject("data")를 호출했을 때 

data가 문자열로 인식된다는 것입니다. 

하지만 data는 실제로 JSONObject이기 때문에

문제를 해결하려면 올바른 데이터 유형으로 접근해야 합니다.

 

우선 코드를 간단히 말씀드리자면

 public void sendUserMessage(List<Rtls> getUserDeviceInfoList, Rtls getSafetyManagerInfo
            ,Device deviceInfo, JSONObject jsonObject) throws Exception {

라는 유저에게 메시지를 보내는 메서드를 클래스에서 구현했다고 가정하겠습니다.
이때 sendUserMessage 이 메서드 안에서 JSONObject를 선언을 하고
jsonObject 변수에 여러가지 제이슨 오브젝트를 받는 부분이 있죠?

 

그럼 이제
서비스 임플로 넘어가 보도록 하겠습니다.

@Service
public class HeatServiceImpl implements HeatService{
public void heatIndex(Heat tempData) throws Exception {

// 중략
JSONObject sendJsonObject = new JSONObject();
 sendJsonObject.put("id", id);
 sendJsonObject.put("phoneNum", mobile);
 sendJsonObject.put("type", "heatAlert");
 sendJsonObject.put("data", commonJson);
 sendJsonObject.put("alertType", "14");

// 중략

// MQTT 메시지 전송
commonUtil.sendUserMessage(getUserDeviceInfoList, getSafetyManagerInfo, deviceInfo, sendJsonObject);

}
}

※ 변수명은 기존코드와 다르게 임의로 지정하였습니다.

이런식으로 서비스 구현부에서 sendUserMessage 얘를 호출하는 부분이 있습니다.

구현부에서 내가 sendJsonObject에 담고 싶은 내용을 다 꺼내서 담은 다음에
sendUserMessage 를 호출할때 sendJsonObject 를 >>> JSONObject로 넘겨줘서 사용할 수 있게 하는거죠.

그런데 문제가 있었던 부분은 아래였습니다!

 String heatLevel = ""; //온열단계

            // 알람 타입별 내용 분기 처리
            if () {  // 다른로직
                alertContent = jsonObject.getDouble("data") + "수치가 감지되었습니다." + "\n";
            } else if () { // 다른로직
                alertContent = jsonObject.getString("codeNm") + " : " + jsonObject.getDouble("value")
                        + jsonObject.getString("unit") + "\n"
                        + ((jsonObject.getInt("warningLevel") == 1) ? "경고" : "위험")
                        + " 수치가 감지되었습니다." + "\n";
            }else if (type != null && type.equals("heat")) { // 온열 이상
                JSONObject heatObject = jsonObject.getJSONObject("data");
                heatLevel = heatObject.getString("warningLevel"); // 1 (주의 caution), 2 (경고 warning), 3 (위험  danger)
                    // 경고 수준에 따른 메시지 설정
                    switch (heatLevel) {
                        case 1:
                            heatMsg = "온열질환 주의단계 감지";
                            break;
                        case 2:
                            heatMsg = "온열질환 경고단계 감지";
                            break;
                        case 3:
                            heatMsg = "온열질환 위험단계 감지";
                            break;
                        default:
                            heatMsg = "";
                            break;
                    }
             // 생략

 

어? 어디가 문제라는거지?

JSONObejct로 잘 되어있는데?

JSONObject["data"] is not a string 

 

네, 바로 디버그를 할때에 검색을 jsonObject.getString("data") 로 한것입니다...!! 뜨앗,,,

바보같은 실수죠,,,네,,,

 

 

JSONObject 안에 또 JSONObject가 있는 형식으로 

 

JSONObject["data"] 이 데이터의 키 - data , 값 - JSONObject 라는 것 입니다.

 

{

"id":"1234",

"alertType":"14",

"data":{

    "userNm":"오근주",

    "caller":"N",

    "warningLevel":3,

    "phoneNum":"01000000000",

    "message":"40.5°C"

},

"phoneNum":" 01000000000 ",

"type":"heatAlert"

}

 

이렇게요...ㅎ 그렇기 때문에

꺼내줄때에 String으로 꺼내지 말고

jsonObject.getString("data"); 이렇게 했었던 코드를

jsonObject.getJSONObject("data");

 

요렇게 최종적인 모습이 된것이죠~

 

여러분도 코드에 제이슨 오브젝트 안에 또 제이슨 오브젝트 형식으로 있다면

눈 크게 뜨고 잘 고치시면 됩니다!

 

결론적으로 코딩은 잘해놓고

디버그 할때 값을 잘못 확인한거죠~

잘못된 검색
잘된 디버그

요렇게 검색하시면 됩니당!

그럼 오늘도 수고하셨습니다~!

수정사항있으시면 언제나 댓글주세욤

언제나 감사합니다~

728x90