프로젝트

[SuiteCare/Java] 공공데이터 포털에서 받은 XML을 JSON으로 변환하기

네모세모동동 2024. 5. 2. 11:08

공공데이터 포털에서 제공하는 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;
    }

 

 

 

 

 


[출처]