JSONObject는 내부적으로 HashMap 객체를 갖고 있다. 따라서 JSONObject를 사용하여 JSON을 하나의 객체로 관리할 수 있는 것이다. 또한 내부적으로 사용되는 HashMap에 데이터를 추가함으로써 새로운 JSON 파일로 가공할 수도 있다.


JSONObject에서 제공되는 메서드들은 사실상 내부에 있는 HashMap의 메서드를 통해 구현되어 있다.
필자는 이 당시에 JSONObject를 JSON 타입으로 만들어야 하는 상황이었다. 스프링의 @ResponseBody를 통해
DTO 객체에 JSONObject를 담아서 반환할 경우, 다음과 같이 파싱된다.

JSONObject를 그대로 반환할 경우, 이에 대한 JSON Value 타입으로 변환되지 않는다. 원하는 JSON 타입으로 만들기 위해서는 적어도 Map 타입이어야 한다. 앞서 말한 JSONObject 내부에서 사용하는 HashMap을 반환할 수 있다면 해결되는 문제이다.
실제 검색해본 결과, JSONObject를 Map으로 변경하는 다양한 방법들이 존재했다.
https://stackoverflow.com/questions/21720759/convert-a-json-string-to-a-hashmap
Convert a JSON String to a HashMap
I'm using Java, and I have a String which is JSON: { "name" : "abc" , "email id " : ["abc@gmail.com","def@gmail.com","ghi@gmail.com"] } Then my Map in Java: Map<String, Object> retMap = new
stackoverflow.com
https://dion-ko.tistory.com/112
[Java] 자바 Map to JSONObject, JSONObject to Map 사용법 & 예제
API 서버나 데이터를 가공해야 할 경우 JSONObject()를 Map(String, String) 형식으로 형변환을 해야할 경우가 종종 있습니다. 매번 Class에 생성하기 보다는 Util 형식으로 만들어 쓰시면 편할거 같습니다. J
dion-ko.tistory.com
코드를 보면 알겠지만 상당히 복잡하고 번거롭다... 그냥 갖고있는 HashMap을 반환해주는 메서드가 구현되어 있으면 좋을텐데라는 생각과 함께 JSONObject 메서드들을 더 찾아보게 되었고, 그토록 원하던 메서드를 발견할 수 있었다.

JSONObject는 toMap()이라는 메서드를 제공하고 있다. 이 메서드를 사용하면 HashMap 객체를 생성해서 해당 JSONObject에 담겨있는 여러 엔트리들을 담아서 반환한다. nested JSON 같이 여러 JSON 객체가 중첩되어 있는 경우도 지원한다.
재밌는 점은 StackOverFlow에 작성되어 있는 솔루션 코드와 유사하다.
public static Map<String, Object> jsonToMap(JSONObject json) throws JSONException {
Map<String, Object> retMap = new HashMap<String, Object>();
if(json != JSONObject.NULL) {
retMap = toMap(json);
}
return retMap;
}
public static Map<String, Object> toMap(JSONObject object) throws JSONException {
Map<String, Object> map = new HashMap<String, Object>();
Iterator<String> keysItr = object.keys();
while(keysItr.hasNext()) {
String key = keysItr.next();
Object value = object.get(key);
if(value instanceof JSONArray) {
value = toList((JSONArray) value);
}
else if(value instanceof JSONObject) {
value = toMap((JSONObject) value);
}
map.put(key, value);
}
return map;
}
public static List<Object> toList(JSONArray array) throws JSONException {
List<Object> list = new ArrayList<Object>();
for(int i = 0; i < array.length(); i++) {
Object value = array.get(i);
if(value instanceof JSONArray) {
value = toList((JSONArray) value);
}
else if(value instanceof JSONObject) {
value = toMap((JSONObject) value);
}
list.add(value);
}
return list;
}
위 코드가 9년 전에 게시된 글이다보니 JSONObject의 toMap()는 그 이후에 구현된 메서드인 것 같다.
결론 : 공식문서, 소스파일, StackOverFlow를 항상 정독하고 끝까지 포기하지 말고 찾아보자!
'사이드 프로젝트 > 스프링 부트 기반 축구 웹 사이트' 카테고리의 다른 글
1. 외부 API로부터 데이터를 가져와 JSON으로 반환하기 (0) | 2023.08.01 |
---|