안녕하세요 jju_developer입니다.
어김없이 퇴근 후 돌아왔습니다.
오늘은 코딩하다보면 쉽게 나타나는 오류에 대해 적어보려고 합니다~
바로바로
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");
요렇게 최종적인 모습이 된것이죠~
여러분도 코드에 제이슨 오브젝트 안에 또 제이슨 오브젝트 형식으로 있다면
눈 크게 뜨고 잘 고치시면 됩니다!
결론적으로 코딩은 잘해놓고
디버그 할때 값을 잘못 확인한거죠~
요렇게 검색하시면 됩니당!
그럼 오늘도 수고하셨습니다~!

수정사항있으시면 언제나 댓글주세욤♡
언제나 감사합니다~
'백엔드 관련' 카테고리의 다른 글
[jar] 자르 파일 인터넷에서 다운받고 dependency 추가 할 때 (128) | 2024.07.17 |
---|---|
[java] GOOGLE OTP란? 구글 인증 서비스 도입 방법 (One-Time Password) (66) | 2024.07.16 |
@PostConstruct 의존성 주입 완료 후 초기화 작업!! (0) | 2024.06.13 |
가장 간단한 텍스트 mp3 파일로 만드는 방법 (feat. 파파고) (1) | 2024.06.13 |
스프링 maven 설정 오류 (2) | 2024.06.11 |