[Android] Android Open API Application(2)

Updated:

  • 이전 글에서는 xml 형식 데이터를 활용했다.
  • 이번에는 json 형식 데이터를 불러와보자.
  • 액티비티와 레이아웃은 이전 글과 동일하게 설정.
  • Main Activity에서 show 함수만 다르게 쓴다.

show()

json parsing

public void show() {

    String urlStr = "https://samples.openweathermap.org/data/2.5/weather?q=London&appid=439d4b804bc8187953eb36d2a8c26a02";
    URL url;
    char[] data = new char[255];
    StringBuffer sb = new StringBuffer();

    try {
        url = new URL(urlStr);

        // url에 커넥션 수립
        URLConnection connection = url.openConnection();

        // HTTP 프로토콜에 적합하게 HttpURLConnection로 캐스팅
        HttpURLConnection httpConnection = (HttpURLConnection) connection;

        // 연결상태를 체크하여 정상일 때만 데이터 처리
        int resCode = httpConnection.getResponseCode();
        if (resCode == HttpURLConnection.HTTP_OK) {

            // 자원에서 데이터를 읽을 수 있도록 InputStream을 얻는다.
            InputStream in = httpConnection.getInputStream();
            InputStreamReader isr = new InputStreamReader(in);
            while (isr.read(data) > 0) {
                sb.append(data);
                if (in.available() < 255) {
                    for (int i = 0; i < data.length; i++) {
                        data[i] = ' ';
                    }
                }
            }
            System.out.println(sb);
            isr.close();
            JSONObject weatherInfo = new JSONObject(sb.toString());
            JSONObject coord = weatherInfo.getJSONObject("coord");
            JSONObject main = weatherInfo.getJSONObject("main");
            String name = weatherInfo.getString("name");
            Coord c = new Coord(coord.getDouble("lon"), coord.getDouble("lat"));
            Main m = new Main(main.getDouble("temp"), main.getDouble("pressure"), main.getDouble("humidity"));
            WeatherInfo w = new WeatherInfo(name, c, m);
            textView.setText(w.toString());
        }

    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

Main 클래스(DTO)

public class Main {
    private double temp;
    private double pressure;
    private double humidity;
    //...

Coord 클래스(DTO)

public class Coord {
    private double lon;
    private double lat;
    //...

WeatherInfo 클래스(DTO)

public class WeatherInfo {
    private String name;
    private Coord c;
    private Main m;
    //...

Leave a comment