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

 날씨과 관련된 프로그램을 제작하는 분들이라면 기상청에서 제공하는 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