Preloader image
DDD

자바

네이버 한글인명-로마자변환 Open API 예제 (수정판 - 3차 배열 처리) - 3 Array Json Parser Sample

작성자 관리자 (admin)
조회수 157
입력일 2020-12-21 15:24:27

package com.erp.common;

//네이버 한글인명-로마자변환 Open API 예제
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.erp.board.BoardController;

//네이버 한글인명-로마자변환 API 예제
public class ApiExamRoman
{
    private static final String clientId = "**********************"; // 네이버 클라이언트 아이디
    private static final String   secret = "**********"; // 네이버 클라이언트 시크릿 키

    public static void main(String[] args) throws Exception
    {
        String called_name = null;
        try {
            called_name = URLEncoder.encode("이대범", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("검색어 인코딩 실패",e);
        }
        String apiURL = "https://openapi.naver.com/v1/krdict/romanization?query="+ called_name;
        
        Map<String, String> requestHeaders = new HashMap<>();
        requestHeaders.put( "X-Naver-Client-Id"    , clientId );
        requestHeaders.put( "X-Naver-Client-Secret", secret   );
        String responseBody = get(apiURL,requestHeaders);

        /*
        // 다이렉터 테스트 시
        String responseBody = 
                "{"
                + "\"aResult\":\r\n"
                + "        [\r\n"
                + "            {\r\n"
                + "            \"sFirstName\":\"\\uc774\",\r\n"
                + "            \"aItems\":[{\"name\":\"Lee Daebum\",\"score\":\"99\"},{\"name\":\"Lee Daebeom\",\"score\":\"76\"},{\"name\":\"Lee Deabum\",\"score\":\"27\"},{\"name\":\"Lee Deabeom\",\"score\":\"20\"}]\r\n"
                + "            }\r\n"
                + "        ]\r\n"
                + "    }";
        */

        /*
        // JSONObjet : key-value
        JSONObject jObject = new JSONObject(responseBody);    // json 전체 데이터
        JSONArray   jArray = jObject.getJSONArray("aResult"); // 1번째 분할
        String sFirstName;
        
        // aResult 기준으로 배열 출력
        for (int i = 0; i < jArray.length(); i++)
        {
            JSONObject        obj = jArray.getJSONObject(i);
                       sFirstName = obj.getString("sFirstName");
            System.out.println("sFirstName(" + i + "): " + sFirstName);
            System.out.println("sFirstName(" + i + "): " + jArray.getJSONObject(0).getString("sFirstName"));
            System.out.println();
        
            // sub json array
            JSONArray subArray = obj.getJSONArray("aItems");
            System.out.println( "subArray : " + subArray );
            
            for (int j = 0; j < subArray.length(); j++)
            {
                System.out.println("name(" + j + "): " + subArray.getJSONObject(j).getString("name"));
            }
            System.out.println();
        }
        */

        display_roma( responseBody,"aResult","sFirstName","aItems","name", "0" ); // 1 : 단일출력, 0 : 전체 출력
        System.out.println("responseBody : " + responseBody);
    }

    /**
     * json 3차배열 parser
     * @param json_data
     * @param div_txt_1
     * @param dsp_nm_1
     * @param div_txt_2
     * @param dsp_nm_2
     * @param flag
     * @return
     * @throws Exception
     */
    private static String display_roma( String json_data, String div_txt_1, String dsp_nm_1, String div_txt_2, String dsp_nm_2, String flag ) throws Exception 
    {
        // JSONObjet : key-value
        JSONObject jObject = new JSONObject(json_data);       // json 전체 데이터
        JSONArray   jArray = jObject.getJSONArray(div_txt_1); // 1번째 분할
        String sFirstName;
        String result = null;

        // div_txt_1 기준으로 배열 출력
        for (int i = 0; i < jArray.length(); i++)
        {
            JSONObject obj = jArray.getJSONObject(i);
            sFirstName = obj.getString(dsp_nm_1);
            System.out.println( dsp_nm_1 + "(" + i + "): " + sFirstName); // debug
            System.out.println();                                         // debug

            // div_txt_2 기준으로 배열 출력 sub json array
            JSONArray subArray = obj.getJSONArray(div_txt_2);
            System.out.println( "subArray : " + subArray );

            for (int j = 0; j < subArray.length(); j++)
            {
                result += subArray.getJSONObject(j).getString(dsp_nm_2);
                System.out.println("name(" + j + "): " + subArray.getJSONObject(j).getString(dsp_nm_2)); // debug
                
                if( "1".equals(flag) ) break;
                else                   continue;
            }
            System.out.println();
        }

        return result;
    }
    
    
    /**
     * 
     * @param apiUrl
     * @param requestHeaders
     * @return
     */
    public static String get(String apiUrl, Map<String, String> requestHeaders){
        HttpURLConnection con = connect(apiUrl);
        try {
            con.setRequestMethod("GET");
            for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
                con.setRequestProperty(header.getKey(), header.getValue());
            }
    
            int responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
                return readBody(con.getInputStream());
            } else { // 에러 발생
                return readBody(con.getErrorStream());
            }
        } catch (IOException e) {
            throw new RuntimeException("API 요청과 응답 실패", e);
        } finally {
            con.disconnect();
        }
    }
    
    /**
     * 
     * @param apiUrl
     * @return
     */
    private static HttpURLConnection connect(String apiUrl)
    {
        try {
            URL url = new URL(apiUrl);
            return (HttpURLConnection)url.openConnection();
        } catch (MalformedURLException e) {
            throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
        } catch (IOException e) {
            throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
        }
    }
    
    /**
     * 
     * @param body
     * @return
     */
    private static String readBody(InputStream body)
    {
        InputStreamReader streamReader = new InputStreamReader(body);

        try (BufferedReader lineReader = new BufferedReader(streamReader)) {
            StringBuilder responseBody = new StringBuilder();
    
            String line;
            int count = 0;
            while ((line = lineReader.readLine()) != null) {
                if( count > 0) break;
                responseBody.append(line);
                System.out.println("line : " + line);
                count++;
            }
    
            return responseBody.toString();
        } catch (IOException e) {
            throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
        }
    }
}

^