본문 바로가기

프로그래밍 이야기

Jersey에서 원소가 한개인 JSONArray를 반환할 때 Array로 반환되지 않는 문제 해결

Jersey 라이브러리를 사용하여 REST서비스를 구현할 때, 일반적으로 JSON을 사용하여 데이터를 반환하게 됩니다.

반환하는 데이터가 여러 데이터를 포함하고 있을 경우 ArrayList와 같이 리스트 형태로 데이터를 저장하고, 이를 Jersey에서 JSONArray로 반환해줍니다.


그런데, 얼마 전에 한가지 문제를 발견했습니다. 반환은 리스트로 하는데, 그 안에 들어가 있는 원소가 한 개 밖에 없는 경우 JSONArray로 반환되지 않고, JSONObject로 반환이 되더군요. -_- 썩을... 


즉, 아래와 같은 상황이 벌어지는 거죠. email과 password를 가지는 객체의 리스트를 반환한다 가정할 때, 원래 반환되어야 하는 형식은


[{"email":"test@test.com","password":"password"}]


이 되어야 하는데, 정작 반환될 때


{"email":"test@test.com","password":"password"}


와 같이 JSONElement로 반환되어 버리니 이를 파싱하는 쪽에서는 죽어나가죠-_-... 처음엔 어떻게 해결해야하는지 몰라서 try~catch로 임시로 해결하긴 했었는데, 찾아보니 간단하게 해결방법이 있습니다.


핵심은 Jersey에서 JSON으로 변환을 할 때 JAXB가 아니라 Jackson을 사용하도록 하면 됩니다. 이를 설정하려면 web.xml을 다음과 같이 수정해주시면 됩니다.



사용하실 때는 org.secmem.remoteroid.server 부분을 자신의 REST 서비스가 들어가있는 패키지명으로 바꿔주시면 됩니다. 패키지명이 com.test.server라면 



처럼 쓰시면 됩니다.


관련 링크 : How can I customize serialization of a list of JAXB objects to JSON?