210202

네이버 API로 검색시 정보 불러오기 설명 + Json형식으로 활용 본문

Android

네이버 API로 검색시 정보 불러오기 설명 + Json형식으로 활용

dev210202 2020. 2. 17. 16:38

아래 사이트를 참고하여 네이버 API 검색시 정보 불러오기 기능을 구현했다.

네이버 API는 검색 결과를 Json으로 줘서 활용하기 편했다.

https://developers.naver.com/docs/search/blog/

 

검색 API 블로그 검색 개발가이드

NAVER Developers - 검색 API 블로그 검색 개발가이드

developers.naver.com

공식 문서에서 예제로 주어진 코드는 안드로이드에서 활용하려면 수정이 조금 필요하다.

일단 안드로이드에서 onCreate부분에 코드를 그대로 복붙하면 android.os.NetworkOnMainThreadException이라는 에러메시지가 나온다. 이를 해결하기 위해서는 AsyncTask를 사용하여 해결하면 된다.

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... voids) {
             String clientId = "YOUR_CLIENT_ID";//애플리케이션 클라이언트 아이디값";
       		 String clientSecret = "YOUR_CLIENT_SECRET";//애플리케이션 클라이언트 시크릿값";
       		 try {
                  String text = URLEncoder.encode("그린팩토리", "UTF-8");
                  String apiURL = "https://openapi.naver.com/v1/search/blog?query="+ text; // json 결과
                  //String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text; // xml 결과
                  URL url = new URL(apiURL);
                  HttpURLConnection con = (HttpURLConnection)url.openConnection();
                  con.setRequestMethod("GET");
                  con.setRequestProperty("X-Naver-Client-Id", clientId);
                  con.setRequestProperty("X-Naver-Client-Secret", clientSecret);
                  int responseCode = con.getResponseCode();
                  BufferedReader br;
                  if(responseCode==200) { // 정상 호출
                      br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                  } else {  // 에러 발생
                      br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
                  }
                  String inputLine;
                  StringBuffer response = new StringBuffer();
                  while ((inputLine = br.readLine()) != null) {
                      response.append(inputLine);
                  }
                  br.close();
                  System.out.println(response.toString());
              } catch (Exception e) {
                  System.out.println(e);
              }

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            
        }
    }
{"lastBuildDate": "Mon, 17 Feb 2020 15:33:26 +0900",
"total": 362,
"start": 1,
"display": 10,
"items": [{"title": "~~<b>치킨</b> ~~점","link": "http://~~~.kr","category": "음식점>치킨,닭강정","description": "","telephone": "","address": "서울특별시 ~~구 ~~동 123-3","roadAddress": "서울특별시 ~~구 ~~로 111","mapx": "123122","mapy": "512304"},

만들어진 MyAsyncTask를 onCreate에서 MyAsyncTask();로 호출하여 제대로 실행하게 되면 response.toString()을 수행한 결과로 Json 형식으로 나오는것을 볼 수 있다.(위의 코드는 items에서 하나만 표시한거고 실제로는 여러개가 나옴) 이를 Json형식으로 바꾸고 원하는 값(title,address,roadAddress)을 얻기 위해서 다음과 같이 고쳤다.

   	    System.out.println(response.toString());
            // 여기서부터 추가한 부분
            JSONParser parser = new JSONParser();
            Object obj = parser.parse(response.toString());


            JSONObject jsonObject = (JSONObject) obj;
            JSONArray getArray = (JSONArray) jsonObject.get("items");
            for (int i = 0; i < getArray.size(); i++) {
                JSONObject object = (JSONObject) getArray.get(i);

                String getTitle = (String) object.get("title");
                String address = (String) object.get("address");
                String roadAddress = (String) object.get("roadAddress");

                String titleFilter = getTitle.replaceAll("<b>", "");
                String title = titleFilter.replaceAll("</b>", "");

                Log.e("test", title);
                Log.e("test", address);
                Log.e("test", roadAddress);
                 
             }
             // 여기까지가 끝

 

JSONParser를 통해서 String으로 받아진 Json 형식을 Object에 넣고 Object를 다시 JSONObject로 만든 뒤 내가 원하는 값(title, address, roadAddress)가 들어있는 key값인 items값들이 여러개이므로 JSONArray에 저장하여 하나씩 차례대로 JSONObject 객체인 object에 설정한 뒤 필요한 값을 뽑게 만들었다.

 

 

Comments