안녕하세요!(다들 잘 지내셨나요 하하)
post 요청을 하려고 HashMap을 이용해 body를 생성하던 중 문제가 생겨(!)
LinkedHashMap으로 바꾸었던 썰(!)을 써보려고 합니다~
(최대한 비슷한 코드로 재연해볼게유!)
먼저 처음에 짠 body 생성 코드!(절망)
Map<String, Object> body = new HashMap<String, Object>();
Map<String, Object> first = new HashMap<String, Object>();
first.put("first_1", "first_1");
first.put("first_2", "first_2");
Map<String, Object> second = new HashMap<String, Object>();
second.put("second_1", "second_1");
second.put("second_2", "second_2");
Map<String, Object> third = new HashMap<String, Object>();
third.put("third_1", "third_1");
third.put("third_2", "third_2");
body.put("first", first);
body.put("second", second);
body.put("third", third);
log.info("body ::: " + body.toString());
JSONObject jsonBody = new JSONObject(body);
log.info(jsonBody + "");
첫번째는 그냥 습관처럼(!) HashMap을 사용해 body를 만들었어요!
사실 DTO를 이용해서 json으로 파싱해도 되지만 뭔가 이번에 일을 진행한 프로젝트에서 DTO를 사용 안하는 너낌적 너낌..
(쪼랩이여서 뭐가 좋다고 말하긴 잘 모르겠움 뭐가 좋은지는 사람들끼리 박 터지게 싸우더라구여)
고런데 문제가 발생한 것은
결과 순서가 이상한것..?
왼쪽 순서대로 나오기를 기대했지만 오른쪽이 현실..
이는 HashMap은 저장 순서가 없기 때문에 순서가 뒤죽박죽 된 것이더군요!🤦♀️
저렇게 주어진 스펙과 다르게 보내면 파싱할 때 에러가 나기 때문에..
순서가 있는 LinkedHashMap을 사용해보았습니다!
Map<String, Object> body = new LinkedHashMap<String, Object>();
Map<String, Object> first = new LinkedHashMap<String, Object>();
first.put("first_1", "first_1");
first.put("first_2", "first_2");
Map<String, Object> second = new LinkedHashMap<String, Object>();
second.put("second_1", "second_1");
second.put("second_2", "second_2");
Map<String, Object> third = new LinkedHashMap<String, Object>();
third.put("third_1", "third_1");
third.put("third_2", "third_2");
body.put("first", first);
body.put("second", second);
body.put("third", third);
log.info("body ::: " + body.toString());
JSONObject jsonBody = new JSONObject(body);
log.info( "jsonBody ::: " + jsonBody);
그리고 실행해보았는데
저장 순서대로 나오지는 않는 것
약간 희망차지긴 했지만 이친구도 몬가 약간 마라맛 절망..?(매콤)
맵 자체는 정렬이 되었는데 json으로 변환될 때
그냥 JSONObject(저는 org.json.simple.JSONObject 사용했어요)을 사용하면
정렬된 문자열로 되지 않는 듯 하더라구요
흠...
그래서 구글 선생님께서(매우 존칭) 제공해주시는 GSON을 이용해
파싱을 진행했어요!
먼저 pom.xml 추가!
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.7</version>
</dependency>
그리고 요로코롬 gson을 이용해 파싱을 하면...?
<!--앞은 똑같아서 생략-->
Gson gson = new Gson();
String jsonByGson = gson.toJson(body);
log.info("gson ::: " + jsonByGson);
뿌듯하게도 예상대로 파싱이 되는 것을 볼 수 있어용!
고럼 이걸 이제 RestTemplate에 잘 태워서 보내면 된답니다..하하
고럼 끝!(급발진)
즐코하세요~