전체/Java

JSONObject, JSONArray, JSONParser 사용해 데이터 만들어 파싱하기

effortDev 2017. 9. 21. 12:06


1. 사전작업


JSON을 사용하기 위해선 json-simple-1.1.1.jar 라는 라이브러리 파일이 필요하다.


maven이나 구글링을 통해 json사용에 필요한 jar 파일을 다운받고 프로젝트 속성 > java build path > Libraries > Add jars를 통해 라이브러리를 추가한다.



2. JSONObject, JSONArray 데이터 입출력 만들기



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
import java.util.ArrayList;
import java.util.HashMap;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
 
public class JsonTest {
 
    public static void main(String[] args) {
        
        JSONObject jsonObject1 = new JSONObject(); // 중괄호에 들어갈 속성 정의 { "a" : "1", "b" : "2" }
        JSONArray jsonArray1 = new JSONArray(); // 대괄호 정의 [{ "a" : "1", "b" : "2" }]
        JSONObject finalJsonObject1 = new JSONObject(); // 중괄호로 감싸 대괄호의 이름을 정의함 { "c" : [{  "a" : "1", "b" : "2" }] }
 
        jsonObject1.put("이름""잠자리");
        jsonObject1.put("다리갯수""6");
        jsonArray1.add(jsonObject1);
 
        jsonObject1 = new JSONObject();
        jsonObject1.put("이름""사슴벌레");
        jsonObject1.put("다리갯수""6");
        jsonArray1.add(jsonObject1);
        
        finalJsonObject1.put("곤충", jsonArray1);
 
        finalJsonObject1.put("동물""코끼리");
        finalJsonObject1.put("식물""무궁화");
        
        System.out.println(finalJsonObject1);
 
        /* finalJsonObject1 출력값
          
         {  
               "식물":"무궁화",
               "곤충":[  
                          {  
                             "이름":"잠자리",
                             "다리갯수":"6"
                          },
                          {  
                             "이름":"사슴벌레",
                             "다리갯수":"6"
                          }
                       ],
               "동물":"코끼리"
          }
          
         */
        
    }
}
 
cs


다음과 같이 만들수는 있는데 작성하고 보면 


Type safety: The method put(Object, Object) belongs to the raw type HashMap. References to generic type HashMap<K,V> should be parameterized

Type safety: The method add(Object) belongs to the raw type ArrayList. References to generic type ArrayList<E> should be parameterized


노란색경고가 뜨며 Generic을 통해 타입을 지정해 safety하게 데이터입력을 넣어라고 말해주고 있다.


json 형태의 데이터를 DB나 웹서버에서 가져올때는 json데이터를 넣어주지않고 적절하게 가공만 하면 되므로 문제되지 않지만 다음과 같이 직접적으로 Generic 타입 선언 없이 put으로만 일방적으로 넣었을때 경고가 나타난것이다.



3. HashMap을 통해 Generic 데이터를 넣고 JSONObject로 형변환한 데이터 넣기



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
import java.util.ArrayList;
import java.util.HashMap;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
 
public class JsonTest2 {
 
    public static void main(String[] args) {
        
        HashMap<String, Object> myHashMap1 = new HashMap<String, Object>();
        JSONObject jsonObject1 = new JSONObject(); // 중괄호에 들어갈 속성 정의 { "a" : "1", "b" : "2" }
        JSONArray jsonArray1 = new JSONArray(); // 대괄호 정의 [{ "a" : "1", "b" : "2" }]
        JSONObject finalJsonObject1 = new JSONObject(); // 중괄호로 감싸 대괄호의 이름을 정의함 { "c" : [{  "a" : "1", "b" : "2" }] }
        
        myHashMap1.put("이름""잠자리");
        myHashMap1.put("다리갯수""6");
        
        jsonObject1 = new JSONObject(myHashMap1); 
        jsonArray1.add(jsonObject1);
        
        myHashMap1 = new HashMap<String, Object>();
        myHashMap1.put("이름""사슴벌레");
        myHashMap1.put("다리갯수""6");
        
        jsonObject1 = new JSONObject(myHashMap1);
        jsonArray1.add(jsonObject1);
        
        finalJsonObject1.put("곤충", jsonArray1);
        finalJsonObject1.put("동물""코끼리");
        finalJsonObject1.put("식물""무궁화");
        
        System.out.println(finalJsonObject1);
        
        /*
          
         {  
               "식물":"무궁화",
               "곤충":[  
                          {  
                             "이름":"잠자리",
                             "다리갯수":"6"
                          },
                          {  
                             "이름":"사슴벌레",
                             "다리갯수":"6"
                          }
                       ],
               "동물":"코끼리"
          }
          
         */
 
    }
}
cs


다음은 HashMap을 사용해 들어갈 데이터 형식을 Generic <String, Object>로 선언해주어 2번의 노란색 경고를 없앤 코드이다.


출력값은 2번과 3번 모두 동일하다. 



4. String형식의 JSON 데이터를 JSON형식으로 바꾸어 파싱하기


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
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
 
public class StringToJson {
 
    public static void main(String[] args) {
        String jsonString1 = "{\"식물\":\"무궁화\",\"곤충\":[{\"이름\":\"잠자리\",\"다리갯수\":\"6\"},{\"이름\":\"사슴벌레\",\"다리갯수\":\"6\"}],\"동물\":\"코끼리\"}";
        JSONParser jsonParser1 = new JSONParser();
        JSONObject jsonObject1;
 
        try {
            
            jsonObject1 = (JSONObject) jsonParser1.parse(jsonString1);
            JSONArray jsonArray1 = (JSONArray) jsonObject1.get("곤충");
      
            for(int i=0; i<jsonArray1.size(); i++){
                System.out.println("곤충"+ i +" : " +jsonArray1.get(i));            
                JSONObject objectInArray = (JSONObject) jsonArray1.get(i);
                System.out.println("Key값은 "+objectInArray.get("이름"));
                System.out.println("Value값은 "+objectInArray.get("다리갯수"));
            }
            /*
             
                곤충0 : {"이름":"잠자리","다리갯수":"6"}
                Key값은 잠자리
                Value값은 6
                
                곤충1 : {"이름":"사슴벌레","다리갯수":"6"}
                Key값은 사슴벌레
                Value값은 6
             
             */
            
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
cs


String 형의 JSON 값을 JSON형으로 바꾸어 파싱을 해 출력하는 코드이다.

파싱을 위해 JSONParser를 사용했고 단계적으로 Array, Object에 접근해 값을 찾아가고 있다.

소스코드 첨부파일

workspace.zip