안드로이드/애플리케이션 제작

(JSON) 기상청으로부터 지역코드 받아오기

Justin T. 2014. 8. 15. 23:27

 날씨과 관련된 프로그램을 제작하는 분들이라면 기상청에서 제공하는 api가 거의 반드시 필요하실 것이라 생각합니다.

 기상청으로부터 자신이 원하는 지역의 날씨를 받아오기 위해서는 기상청에서 제공하는 RSS를 수신하여 이를 가지고 날씨를 알아낼 수 있습니다. 이를 위해서는 기상청에서 제공하는 지역코드를 통해 해당 지역의 날씨를 받아와야 하지요.

 기상청에서는 해당 지역코드를 알아내기 위해 다음과 같은 JSON파일을 제공합니다.


각 지역 시,도의 코드를 제공합니다.

http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl.11.json.txt
mdl.11.json에서 11은 위에서 알아댄 시,도 코드입니다. 해당 코드를 입력하면 해당 시,도의 시군구 목록이 나타납니다.

leaf.11545,json에서 11545는 위의 과정에서 알아낸 시군구 코드입니다. 이 코드를 통해 자신이 원하는 자료를 알아내실 수 있습니다.

위의 주소로 접속할 경우 다음과 같이 알 수 없는 메시지가 나오는 경우가 있습니다.


이는 JSON파일을 읽어들이는데 인코딩 문제로 인해 나타는 경우입니다. 이를 제대로 보기 위해서 오른쪽 버튼을 클릭한 후 인코딩 → UTF-8 로 변경하시면 됩니다.





그럼 이 JSON파일을 사용하여 지역코드를 받아오는 코드를 간단하게 짜보도록 하겠습니다.


※안드로이드에서는 기본적으로 JSON을 활용하는 클래스가 설정되어 있어 간단하게 사용이 가능합니다. 순수 자바로 구현할 경우 별도의 과정이 추가로 필요합니다.

import org.json.JSONArray;

import org.json.JSONObject;



1. 먼저 JSON을 통해 인터넷에 접속하기 위해서는 안드로이드에 인터넷 접속을 허용하는 permission을 다음과 같이 추가합니다.


AndroidMenifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.framework.json" >
 
    <uses-permission android:name="android.permission.INTERNET" />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
cs


2. 다음으로 아래의 코드를 삽입해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class MainActivity extends AppCompatActivity {
    URL RSSurl = null;
    rcvJson RJ;
    URLConnection connect;
    JSONObject JStoken;
    String getJSON;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ....
 
 
        TextView textview = (TextView) findViewById(R.id.textView);
 
        try {
            String Local1 = "서울특별시";
            String Local2 = "용산구";
            String Local3 = "서빙고동";
            String temp;
            String x="0",y="0";
            JSONArray JSA;
 
            RSSurl = new URL("http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt");
            RJ = new rcvJson();
            RJ.start();
            RJ.join();
            JSA = new JSONArray(getJSON);
 
            temp="";
 
            for(int i=0; i < JSA.length(); i++){
                JStoken = JSA.getJSONObject(i);
                if(JStoken.get(JStoken.names().getString(0)).equals(Local1)){
                    temp += JStoken.get(JStoken.names().getString(1));
                    break;
                }
            }
 
            RSSurl = new URL("http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl."+temp+".json.txt");
            RJ = new rcvJson();
            RJ.start();
            RJ.join();
            JSA = new JSONArray(getJSON);
 
            temp="";
 
            for(int i=0; i < JSA.length(); i++){
                JStoken = JSA.getJSONObject(i);
                if(JStoken.get(JStoken.names().getString(0)).equals(Local2)){
                    temp += JStoken.get(JStoken.names().getString(1));
                    break;
                }
            }
 
            RSSurl = new URL("http://www.kma.go.kr/DFSROOT/POINT/DATA/leaf."+temp+".json.txt");
            RJ = new rcvJson();
            RJ.start();
            RJ.join();
            JSA = new JSONArray(getJSON);
 
            temp="";
 
            for(int i=0; i < JSA.length(); i++){
                JStoken = JSA.getJSONObject(i);
                x = JStoken.get(JStoken.names().getString(2)).toString();
                y = JStoken.get(JStoken.names().getString(1)).toString();
                if(JStoken.get(JStoken.names().getString(0)).equals(Local3))
                    break;
            }
 
            textview.setText(x + ","+ y);
 
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
 
 
    }
 
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
class rcvJson extends Thread {
        public void run() {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        RSSurl.openStream(), "UTF-8"));
                getJSON = in.readLine();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }


위의 소스코드를 실행하면 아래와 같은 결과를 확인하실 수 있습니다.



300x250