[SuiteCare/Java] 공공데이터 포털에서 받은 XML을 JSON으로 변환하기
공공데이터 포털에서 제공하는 Open Api에서 리턴해주는 데이터 중 XML구문만 있는 경우가 있다.
해당 프로젝트에서는 JSON 타입으로 프론트에 보내줘야했기 때문에 이번 포스팅에서는 XML을 JSON으로 변환하는 방법에 대해서 포스팅하고자 한다.
공공데이터 포털에서 데이터를 받아오는 방법은 지난 포스팅을 참고하면 된다.
[SuiteCare] 공공데이터 포털에 OPEN API 요청하기
이력서의 자격증 검색 기능을 구현하기 위해 공공데이터 포털에 OPEN API를 요청했다. 내가 필요한 데이터를 검색해 확인하고 활용신청을 한다. 신청하고 승인되면 인증키가 발급된다. 승인
sun-note.tistory.com
데이터를 요청하면 아래와 같이 데이터가 넘어온다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<header>
<resultCode>00</resultCode>
<resultMsg>NORMAL SERVICE.</resultMsg>
</header>
<body>
<items>
<item>
<jmcd>0752</jmcd>
<jmfldnm>가스기술사</jmfldnm>
<mdobligfldcd>251</mdobligfldcd>
<mdobligfldnm>안전관리</mdobligfldnm>
<obligfldcd>25</obligfldcd>
<obligfldnm>안전관리</obligfldnm>
<qualgbcd>T</qualgbcd>
<qualgbnm>국가기술자격</qualgbnm>
<seriescd>01</seriescd>
<seriesnm>기술사</seriesnm>
</item>
...
<item>
<jmcd>0740</jmcd>
<jmfldnm>건설안전기술사</jmfldnm>
<mdobligfldcd>251</mdobligfldcd>
<mdobligfldnm>안전관리</mdobligfldnm>
<obligfldcd>25</obligfldcd>
<obligfldnm>안전관리</obligfldnm>
<qualgbcd>T</qualgbcd>
<qualgbnm>국가기술자격</qualgbnm>
<seriescd>01</seriescd>
<seriesnm>기술사</seriesnm>
</item>
</items>
</body>
</response>
1. 필요한 dependency를 추가해준다.
해당 프로젝트에서는 gradle을 사용하고 있어 그에 맞는 dependency를 추가해줬다.
implementation group: 'org.json', name: 'json', version: '20240303'
https://mvnrepository.com/artifact/org.json/json
2. XML.toJSONObject를 사용하면 간단하게 XML을 JSON으로 변환할 수 있다!!
위처럼 넘어오는 데이터를 아래 코드를 통해 JSON으로 변환해주었다.
String xml = sb.toString();
JSONObject jsonObject = XML.toJSONObject(xml);
JSONArray items = jsonObject.getJSONObject("response")
.getJSONObject("body")
.getJSONObject("items")
.getJSONArray("item");
return items;
아래 전체 코드를 확인해보면 데이터가 StringBuilder로 받아진다.
XML.toJSONObject는 파라미터로 String을 받기 때문에 StringBuilder로 되어있는 데이터를 String으로 변경후
JSONObject타입으로 변경해준다.
더 나아가 item 값들을 JSONArray타입으로 추출해서 보내주려 했다.
xml파일의 구조를 파악하고 내가 원하는 값을 추출해야한다.
나는 item배열들을 보내줘야했기 때문에
response > body > items의 item을 JSONArray타입으로 추출했다.
[전체 코드]
public JSONArray certificate() throws IOException {
StringBuilder urlBuilder = new StringBuilder("http://openapi.q-net.or.kr/api/service/rest/InquiryListNationalQualifcationSVC/getList"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + 받은 인증키); /*Service Key*/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
BufferedReader rd;
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8"));
}
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
String xml = sb.toString();
JSONObject jsonObject = XML.toJSONObject(xml);
JSONArray items = jsonObject.getJSONObject("response")
.getJSONObject("body")
.getJSONObject("items")
.getJSONArray("item");
return items;
}
[출처]