티스토리 뷰

프로그래밍/java

java - json 사용하기

박스여우 2015. 8. 2. 10:58

안녕하세요 박스여우입니다.

이번에는 JSON에 대해 알아보겠습니다.




우선, JSON이란?

JavaScript Object Notation의 약자로 인터넷에서 자료를 주고받을때 표현하는 방법입니다. 특히 컴퓨터 프로그램의 변수값을 표연하는데 적합합니다. JSON의 형식은 javascript를 사용하지만, 언어나 풀랫폼에 독립적인것이 특징입니다.



JSON의 기본자료형에는 정수,실수(고정,부동),문자열,배열,객체 가 있습니다. 문자열은 큰따옴표("")안에 넣어서 선언하고, 배열은 대괄호([])안에 넣어서 사용합니다. 또, 객체는 중괄호({})안에 넣어서 사용합니다.



아래는 문자열안에 넣을수있는것 들을 보여주고 있습니다. 위에서 말했듯이 큰따옴표 안에서 이루어 집니다.





아래는 객체의 구조를 나타내주고 있습니다.

객체는 중괄호안에 이름:변수(name:value)쌍들의 비순서화된 set입니다. 이름(name)뒤에 :(콜론)을 붙이고, ,(콤마)로 name/value 쌍을 구별할수 있습니다.



value는 String number,array,true,faluse,null,Object이 올수있습니다. 오브젝트안에 오브젝트를 담을수 있다는 말이네요




그래서! JSON은 왜쓰나? 데이터 표현방식이 JSON으로 이루어진 데이터들을 보다 쉽게 얻을 수 있기 때문입니다.


때마침 저희 학교 홈페이지 공지사항 데이터 표현방식이 



URL

http://www.dsm.hs.kr/notice.brd/_124.1201.1395b9cb/?shell=/index.shell:210


작성자

학교홍보부


내용

2016학년도 신입생모집 전형요강이 확정되어 첨부합니다. 홈페이지 메뉴의 [전형요강] 내용은 7월 중으로 수정할 예정입니다. 많은 관심과 지원 바랍니다.


File

2016학년도 신입생 입학전형 요강.pdf

http://www.dsm.hs.kr/notice.brd/_124.1201.1395b9cb/2016학년도%20신입생%20입학전형%20요강.pdf




위처럼 글이나 사이트의 문자열, 객체 등을 끌어와 다른언어에서도 사용할수있도록 바꿀수 있습니다.





그럼 이제 이클립스에서 JSON을 사용해 봅시다. https://code.google.com/p/json-simple/downloads/list 요기가서 Jsimple.jar을 다운받은뒤 이클립스에 빌드패치를 합니다.


프로젝트 우클릭-build path-Add Libraries또는 Configure Build Path


Add External JARs.. 클릭


JSON을 찾아서 선택해서 진행하면 끝!



그럼 JSON을 이용해서 제가 위에서 보여드린 게시글에서 데이터를 얻어와 봅시다.http://www.dsm.hs.kr/notice.brd?shell=/index.shell:210 이곳에 접속하셔서 우클릭-> 소스보기 var Posts= 부터 ;_post_list(Posts);까지 자른뒤 복사 후 http://json.parser.online.fr/ 요기에서 붙여넣기 하면 아래와 같이깨끗하게 정리된 상태로 정렬되서 보여줍니다.



여기서 잠깐! var Posts= 부터 ;_post_list(Posts);까지 자르는 이유가 뭐냐구요?


지금 저희가 구하려는것은 게시글입니다.

홈페이지에서 게시글의 정보만 딱 불러오기 위함이죠. 소스를 보시면 var Posts=부터 게시글의 정보가 시작되고,

;_post_list(Posts);에서 종료가 됩니다.





그럼 아까 가져왔던 했던 게시글을 찾아봅시다.

번호가 125번이고, 배열 3개에 들어있네요


게시글 각각의 정보를 전체 배열으로 받고, 그 속의 배열 2개를 파해친뒤 2번쨰(1) Value를 받아와야합니다.

그럼 우선 컴파일러에서 소스를 받아와봅시다.

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
        String list[] = new String[100];
        HttpURLConnection httpConn = null;  
        String urlParameters="";
        URL url = new URL("http://www.dsm.hs.kr/notice.brd?shell=/index.shell:210");
        httpConn = (HttpURLConnection)url.openConnection();
        
        //헤더 선언
        httpConn.setDoInput(true);
        //Get Response
        InputStream is = httpConn.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        //소스를 읽어오는 Reader UTF-8로 인코딩한다.
        String line;
        int count=0;
        StringBuffer sb = new StringBuffer();
        String HTML_CONTENT;
        String VAR_POST;
        
        while((line = rd.readLine()) != null) {//한줄씩 읽어와 StringBuffer에 저장
 
                sb.append(line);
 
        }
 
        HTML_CONTENT = sb.toString();
        //var Posts=부터 ;_post_list(Posts); 까지 자른다.
        int F = HTML_CONTENT.indexOf("var Posts="+ ("var Posts=").length();
        int L = HTML_CONTENT.indexOf(";_post_list(Posts);");
        VAR_POST = sb.toString().substring(F, L);
 
cs


다음으로 진짜 파싱을 시작해봅시다.


우선 소스를 모두 JSON이 읽을수있는 객체로 바꾸기위해 Object obj=JSONValue.parse(VAR_POST); 를 넣고, 게시글 하나하나를 배열로 받아옵니다. JSONArray array=(JSONArray)obj;


이제 반복문으로 게시글을 탐색하고, 위의 게시글번호 125번을 검색합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 for(int i=1;i<array.size();i++)
         {
             JSONArray JA = (JSONArray)array.get(i);
             JSONArray JA1 = (JSONArray)JA.get(0);
             int check = Integer.valueOf(((JSONArray)JA1.get(0)).get(1).toString());
             if(check==125){
             link = JA1.get(2).toString();
             writer = JA.get(5).toString();
             title = JA.get(6).toString();
             contact = JA1.get(4).toString();
            date = ((JSONArray)JA.get(2)).get(0).toString();
            time = ((JSONArray)JA.get(2)).get(1).toString();
             System.out.println(title+"\r\n"+writer+"\r\n"+date+"\r\n"+contact+"\r\n"+time+"\r\n"+link+"\r\n");
            break;
             }
             }
 
cs


게시글 정보를 받아오는데, 게시글도 배열로 구성되어 있어서 배열로 받아옵니다.

JSONArray JA = (JSONArray)array.get(i);


게시글 배열안의 배열 0번을 받아옵니다.

JSONArray JA1 = (JSONArray)JA.get(0);


게시글 배열안의 0번배열의 0번배열의 2번째 value를 받아옵니다.

int check = Integer.valueOf(((JSONArray)JA1.get(0)).get(1).toString());



http://json.parser.online.fr/ 에서 정리된것을 보면 대충 감이 오실겁니다.



아래는 최종적인 소스입니다.

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
    public static void main(String args[]){
        try{
        String list[] = new String[100];
        HttpURLConnection httpConn = null;  
        String urlParameters="";
        URL url = new URL("http://www.dsm.hs.kr/notice.brd?shell=/index.shell:210");
        httpConn = (HttpURLConnection)url.openConnection();
        
        //헤더 선언
        httpConn.setDoInput(true);
        //Get Response
        InputStream is = httpConn.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        
        String line;
        int count=0;
        StringBuffer sb = new StringBuffer();
        String HTML_CONTENT;
        String VAR_POST;
        
        while((line = rd.readLine()) != null) {
 
                sb.append(line);
 
        }
 
        HTML_CONTENT = sb.toString();
        
        int F = HTML_CONTENT.indexOf("var Posts="+ ("var Posts=").length();
        int L = HTML_CONTENT.indexOf(";_post_list(Posts);");
        VAR_POST = sb.toString().substring(F, L);
        
         String title,writer,date,contact,time,link;
         
         Object obj=JSONValue.parse(VAR_POST);
         
         JSONArray array=(JSONArray)obj;
         
         for(int i=1;i<array.size();i++)
         {
             JSONArray JA = (JSONArray)array.get(i);
             JSONArray JA1 = (JSONArray)JA.get(0);
             int check = Integer.valueOf(((JSONArray)JA1.get(0)).get(1).toString());
             if(check==125){
             link = JA1.get(2).toString();
             writer = JA.get(5).toString();
             title = JA.get(6).toString();
             contact = JA1.get(4).toString();
            date = ((JSONArray)JA.get(2)).get(0).toString();
            time = ((JSONArray)JA.get(2)).get(1).toString();
             System.out.println(title+"\r\n"+writer+"\r\n"+date+"\r\n"+contact+"\r\n"+time+"\r\n"+link+"\r\n");
            break;
             }
             }
         
        }catch(Exception e){}
    }
cs



이상! 박스여우의 허접한 Java - JSON 사용하기였습니다!

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함