210202
네이버 API로 검색시 정보 불러오기 설명 + Json형식으로 활용 본문
아래 사이트를 참고하여 네이버 API 검색시 정보 불러오기 기능을 구현했다.
네이버 API는 검색 결과를 Json으로 줘서 활용하기 편했다.
https://developers.naver.com/docs/search/blog/
공식 문서에서 예제로 주어진 코드는 안드로이드에서 활용하려면 수정이 조금 필요하다.
일단 안드로이드에서 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에 설정한 뒤 필요한 값을 뽑게 만들었다.
'Android' 카테고리의 다른 글
몇초마다 자동으로 텍스트뷰 변하게하기(Github 오픈소스) (2) | 2020.02.20 |
---|---|
페이지 슬라이딩 애니메이션 아래에서 위로 구현하기 (0) | 2020.02.18 |
커스텀 리스트뷰 구현 + AsyncTask 사용 시 View에 반영 안되는 경우 (0) | 2020.02.18 |
TMap API를 사용하여 현재 위치에 마커 구현하기 (0) | 2020.02.16 |
GPS로 현재위치(위도, 경도)가져오기 설명 (2) | 2020.02.16 |
Comments