[자바] JSON, JSONArray, JSONObject, 또 파싱하는법.. 프로젝트에서 사용하는 JSON의 개념에 대하여
개요
프로젝트를 진행하다보면 JSON형태로 데이터를 전달하는 경우가 많다.
데이터를 넣고 빼기가 쉽고 텍스트로 이루어져 있어 사람이 직관적으로 볼 수 있기 때문이다.
그런데 이걸 사용하면서도 여기서 이걸 쓰나? 이렇게 파싱하는게 맞나? 어 에러 안나네. 근데 왜 이렇게 파싱하는거지? 이렇게하면 왜 파싱 오류가 뜨는거지? 하면서 의문을 가질 때가 종종 있다.
그래서 그런 혼동을 줄여보고자 개념을 정리하는 시간을 가졌다.
JSON?
'키-값 쌍으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷' 이다. JSON을 한번이라도 써보면 get을 이용해 값을 가져오고 put을 이용해 값을 넣는 것을 봤을 것이다. 이 때, key를 사용해서 value를 가져오고 값을 넣을 수가 있다.
AJAX를 사용할때, 넓게는 XML을 대체하는 주요 데이터 포맷이다. 자료의 종류에 큰 제한이 없다.
아.. AJAX에서는 숱하게 사용해오곤 했는데 XML을 대체한다는게 무슨 뜻이지?
먼저 XML은 HTML과 흡사한 문자 기반 마크업 언어이다.
그런데 HTML처럼 데이터를 보여주는게 목적이 아니라 데이터를 저장하고 전달할 목적으로 만들어졌다.
예시로,
<human>
<name>홍길동</name>
<age>29</age>
<weight>68</weight>
</human>
이런식으로 사용자가 정의한 태그에 데이터를 넣어 전달한다. 미리 정의된 HTML과의 차이점이라고 볼 수 있다.
JSON은 이런 형태의 XML 전달구조를 대체하여 데이터를 전달한다는 뜻이다.
즉, JSON형태로 XML 예시를 바꿔보면
{
"name": "홍길동",
"age": 29,
"weight": 68
}
이런식이 된다.
JSONObject? JSONArray?
이 둘은 JSON의 두가지 기본 구조다.
먼저 JSONObject는 앞의 예제문과 같은 구조를 같는다. name과 value가 쌍을 이루고 그것을 ':' 콜론으로 구분한다.
JSONObject jObj = new JSONObject; // JSONObject 생성
jObj.put("name" : "홍길동"); // JSONObject에 값 넣기
jObj.put("age" : 29);
jObj.put("weight" : 68);
String data = jObj.toString(); // JSONObject를 String 에 담기
System.out.print(data);
put을 이용해 데이터를 넣어 사용이 가능하다.
그래서 보통 스프링을 사용하는 프로젝트에서 데이터를 가져올 경우 put을 이용해 값을 집어넣는다.
그리고 Controller에서 addObject()를 사용하여 JSONObject형태의 데이터를 JSP페이지에 전달한다.
mav.addObject("json", jObj);
JSONArray의 경우 말그대로 JSON형태의 데이터 구조가 Array형태로 되어있다고 생각하면 편한다.
기본 구조는 '[{String name: value},{String name2: value2},...]' 이런 식으로 이어진다.
//스프링의 service.java
//List<hashmap> 형태로 데이터를 가져온다.
List<HashMap<String, Object>> humanMapList = humanDAO.getHumanList(humanList);
JSONArray jsonArrayList = new JSONArray(); // JSONArray 생성
for(int j = 0; j < humanMapList.size(); j++){ //가져온 hashmap 데이터의 갯수만큼 반복
//오브젝트를 생성해 가져온 JSONObject를 담는다.
JSONObject indicatorJobj = JSONObject.fromObject(humanMapList.get(j));
jsonArrayList.add(indicatorJobj);
} //jsonObject형태의 데이터가 Array형태로 쌓이게 된다.
JSONParser?
뒤에 파서라는 이름이 들어간대로 String 형태의 json데이터를 JSON형식으로 바꾸는데 필요한 객체이다. 스프링 프로젝트에서 자바와 자바스크립트 간에 데이터를 교환할때 주로 사용한다.
String jsonString1 = "{\"이름\":\"홍길동\",\"나이\":\"29\"}";
JSONParser jsonParser1 = new JSONParser(); //JSONParser생성
JSONObject jsonObject1; //파싱한 데이터를 담을 JSON객체
//String 형태의 JSON데이터인 jsonString을 파싱하여 jsonObject1에 담아준다.
jsonObject1 = (JSONObject) jsonParser1.parse(jsonString);
String name = (String) jsonObject1.get("이름"); //JSONObject형태의 값을 가져온다.
마치며
내가 이 포스팅을 작성한 이유는 가끔 JSON형태의 데이터를 가공할때 JSONObject.fromObject형태로 갖고 오거나 갖고 오지 않았을 때 발생하는 에러에 대한 의문점에서였다.
결국 json 객체의 형태로 값을 가져와서 사용했을 때 데이터의 형태가 잘못됐다는 점을 알았다.
후에 동일 오류가 재발했을 때 가져온 데이터의 형태를 비교해서 왜 JSON형태로 값을 가져왔을 때 오류가 떴는지에 대한 원인을 포스팅 할 예정이다.