생물 고등어와 순살 진공포장 제품이 있다. 신선하고 값이 더 비싼 생물 생선을 더 선호하겠지만 순살을 고르는 이유는 수산시장까지 가서 그 생물을 운반하는 품을 생각해서이다.
JSON을 쓰는 이유도 동일하다. 무선통신환경에서 가볍게 왔다갔다 하기가 편하니까.
XML을 사용한다고 가정했을때 나라는 데이터를 옮기려면 <자바학생> 하리 </자바학생> 이렇게 태그로 다 닫아줘야하는데 보낼 데이터는 세글자인데 반해 태그 길이는 8글자가 넘어간다. 배보다 배꼽이 더 큰 상황인 것이다. (생선을 샀는데 머리랑 꼬리가 완전 크고 살코기 부위는 조그마한 상황)
텍스트형으로 구조적인 데이터를 전송하긴 어렵다. 문단으로 글이 나눠지긴 하지만, 그 문단안에서 또 구조적으로 나누는건 불가능 하니까. JSON은 구조적인 데이터를 전송하는데 유리하다.
여기서 구조를 갖는다는 것은 뭘까? 계층을 갖는다는 소리다. (위아래가 있다는 소리) 자바의 3대 속성은 은닉성, 상속성, 다형성이다. 이 중에서 상속성을 가장 중시하는데, 상속은 부모-자식 클래스처럼 계층을 갖는다. 따라서 자바의 데이터를 다루기 위해선 JSON을 사용하는 것이 좋다.
{ " 이름 " : " 값 ", " 이름 " : " 값 ", ... , " 이름 " : " 값 " }
{ " 이름 " : [ "값0", "값1", "값2" ] }
{
하위객체이름 : { " 이름 " : " 값 ", " 이름 " : " 값 "},
하위객체이름 : { " 이름 " : " 값 ", " 이름 " : " 값 " }
};
{ " Java Programming " : [ "JAVA", "JSP", "ANDROID"] }
JSON에 포함된 JSON 구조의 장단점
두 방식의 장점을 조합한 형태
<실습 - JSON Obeject를 사용한 데이터 추출처리
import org.json.JSONObject;
import study.java.helper.FileHelper;
public class Main01 {
public static void main(String[] args) {
/** 원래 JSON은 문자열 값~!! */
// String source = "{\"message\" : \"Hello JSON\"}";
/** 구조를 표현하는 데이터이므로 외부 파일로 존재할 수 있다. */
String source = FileHelper.getInstance().readString(
"res/01.json", "utf-8");
// 문자열을 파라미터로 한 JSONObject 객체 생성
JSONObject json = new JSONObject(source);
// message라는 키에 대한 값 추출
String message = json.getString("message");
// 결과 출력
System.out.println(message);
}
}
import org.json.JSONObject;
import study.java.helper.FileHelper;
public class Main02 {
public static void main(String[] args) {
// 파일로부터 JSONObject객체 생성
String source = FileHelper.getInstance().readString(
"res/02.json","utf-8");
JSONObject json = new JSONObject(source);
// 각 key에 대한 value들을 개별적으로 추출.
String title = json.getString("title");
String description = json.getString("description");
String pubDate = json.getString("pubDate");
// 결과 출력
System.out.println("title=" + title);
System.out.println("description=" + description);
System.out.println("pubDate=" + pubDate);
}
}
import org.json.JSONArray;
import org.json.JSONObject;
import study.java.helper.FileHelper;
public class Main03 {
public static void main(String[] args) {
// 파일로부터 JSONObject객체 생성
String source = FileHelper.getInstance().readString(
"res/03.json", "utf-8");
JSONObject json = new JSONObject(source);
// 배열 구조는 JSONArray 객체로 추출한다.
JSONArray array = json.getJSONArray("item");
// 배열의 길이만큼 반복
for (int i = 0; i < array.length(); i++) {
// i번째 요소를 추출 --> 포함된 데이터가 문자열이므로 형변환
String item = String.valueOf(array.get(i));
System.out.println(item);
}
}
}
import org.json.JSONObject;
import study.java.helper.FileHelper;
import study.java.model.News;
public class Main04 {
public static void main(String[] args) {
// 파일로부터 JSONObject객체 생성
String source = FileHelper.getInstance().readString(
"res/04.json", "utf-8");
// 데이터에 계층적으로 접근한다.
JSONObject json = new JSONObject(source);
JSONObject rss = json.getJSONObject("rss");
JSONObject item = rss.getJSONObject("item");
// 데이터 추출
String title = item.getString("title");
String description = item.getString("description");
String pubDate = item.getString("pubDate");
// 추출한 데이터를 Beans의 객체로 재구성
// -> 외부 데이터를 Java의 데이터 규격으로 변환
News news = new News(title, description, pubDate);
System.out.println(news.toString());
}
}
import org.json.JSONArray;
import org.json.JSONObject;
import study.java.helper.FileHelper;
import study.java.model.News;
public class Main05 {
public static void main(String[] args) {
// 파일로부터 JSONObject객체 생성
String source = FileHelper.getInstance().readString(
"res/05.json", "utf-8");
// 배열까지 접근한다.
JSONObject json = new JSONObject(source);
JSONObject rss = json.getJSONObject("rss");
JSONArray item = rss.getJSONArray("item");
// 배열 데이터이므로 반복문 안에서 처리해야 한다.
for (int i=0; i<item.length(); i++) {
JSONObject temp = item.getJSONObject(i);
// 데이터 추출
String title = temp.getString("title");
String description = temp.getString("description");
String pubDate = temp.getString("pubDate");
News news = new News(title, description, pubDate);
System.out.println(news.toString());
}
}
}
이 포스트는 itpaper.co.kr에서 제공되는 강의자료를 바탕으로 작성되었습니다.