JSON

haribo·2021년 2월 27일
0

Java

목록 보기
14/17

Why?

생물 고등어와 순살 진공포장 제품이 있다. 신선하고 값이 더 비싼 생물 생선을 더 선호하겠지만 순살을 고르는 이유는 수산시장까지 가서 그 생물을 운반하는 품을 생각해서이다.

JSON을 쓰는 이유도 동일하다. 무선통신환경에서 가볍게 왔다갔다 하기가 편하니까.

XML을 사용한다고 가정했을때 나라는 데이터를 옮기려면 <자바학생> 하리 </자바학생> 이렇게 태그로 다 닫아줘야하는데 보낼 데이터는 세글자인데 반해 태그 길이는 8글자가 넘어간다. 배보다 배꼽이 더 큰 상황인 것이다. (생선을 샀는데 머리랑 꼬리가 완전 크고 살코기 부위는 조그마한 상황)

텍스트형으로 구조적인 데이터를 전송하긴 어렵다. 문단으로 글이 나눠지긴 하지만, 그 문단안에서 또 구조적으로 나누는건 불가능 하니까. JSON은 구조적인 데이터를 전송하는데 유리하다.

여기서 구조를 갖는다는 것은 뭘까? 계층을 갖는다는 소리다. (위아래가 있다는 소리) 자바의 3대 속성은 은닉성, 상속성, 다형성이다. 이 중에서 상속성을 가장 중시하는데, 상속은 부모-자식 클래스처럼 계층을 갖는다. 따라서 자바의 데이터를 다루기 위해선 JSON을 사용하는 것이 좋다.

*참고사항

  • 자바 : 클래스(설계도)를 미리 만들어두고 객체를 찍어낸다. 유지보수에 용이하지만 클래스를 만드는데 생각할 점이 많다.
  • 자바스크립트 : 프로토타입(찰흙인형), 만들면서 생각해내서 유동적이지만 유지보수가 상대적으로 어렵고, 프로토타입을 한번 만드는데 오래걸린다.
  • 나중에 이 둘이 만난다고 한다. 프로토타입을 기반으로 삼아 클래스를 추출하여 쓴다는데... 거푸집 만드는것과 유사해보인다. 찾아봐야지.

JSON 데이터의 이해

  • JSON(Javascript Object Notation)은 경량의 데이터 교환형식으로 원래는 Javascript에서 객체 지향을 구현하기 위하여 사용되는 문법적 표현이었다.

JSON 표기법의 중요성

  • JSON은 특정 프로그래밍 언어에 종속되지 않고 언어로부터 완벽하게 독립적으로 존재할 수 있으며, 여러 개의 데이터를 구조적(계층적)으로 표현할 수 있는 가장 간결한 표현법이다.
  • 최근에는 웹, 모바일 등을 중심으로 서로 다른 플랫폼간의 데이터 교환을 위하여 활용된다.
  • Java 언어에서는 프로그램 외부에 저장된 파일의 내용을 JSON 형식으로 구성하거나 통신을 통하여 수신하는 데이터를 JSON으로 처리하여 외부로부터의 데이터 읽기에 활용하고 있다. (택배 시키듯... 어린애 입장에선 사진이 실물로 바뀌었습니다! 하는 느낌)

JSON 형식의 데이터 만들기

  • 기본 형식 : 빈 객체("{}") 안에 배열과 같이 콤마(,)로 구별하여 여러 개의 값을 하나의 객체 안에 포함시킨다. 이때, 이름:값의 형태로 할당한다.
{ " 이름 " : " 값 ", " 이름 " : " 값 ", ... , " 이름 " : " 값 " }
  • 자바와 달리 자바스크립트에선 데이터형을 지정하지 않으므로 아무 데이터나 다 넣을 수 있다.
  • 따라서 값 형식에 배열도 포함할 수 있다.
{ " 이름 " : [ "값0", "값1", "값2" ] }
  • JSON을 포함하는 JSON
  • 어떤 형식의 데이터든지 할당할 수 있기 때문에, 그 값에 새로운 JSON 데이터를 할당하여 각각의 JSON데이터들이 하나의 그룹 안에서 계층을 형성하도록 구성할 수 있다. (구조적 표현. 상위객체, 하위객체)
{ 
		하위객체이름 : { " 이름 " : " 값 ", " 이름 " : " 값 "}, 
		하위객체이름 : { " 이름 " : " 값 ", " 이름 " : " 값 " }
};

복합적 데이터의 표현

  • JSON에 포함된 배열구조의 장단점
    • 장점 : 하나의 이름안에 배열로 구성된 여러개의 데이터를 포함할 수 있다. (종류 상관없이 다 때려넣을 수 있다.)
    • 단점 : 하나의 데이터는 오직 하나의 값으로만 구성되기 때문에, 단순한 키워드의 나열과 같은 사용만 가능하다.
{ " Java Programming " : [ "JAVA", "JSP", "ANDROID"] }
  • JSON에 포함된 JSON 구조의 장단점

    • 장점 : 데이터가 계층적으로 구성될 수 있기 때문에, 데이터간의 포함관계를 표현하기가 쉽다.
    • 단점 : 하위 객체로 포함된 JSON의 이름들이 독립적이기 때문에, 하나의 객체 안에 존재하는 하위 객체들간의 연관성이 적다.
  • 두 방식의 장점을 조합한 형태

    • JSON 안에서 하나의 이름에 대한 배열을 구성하고, 각 배열의 요소를 새로운 JSON으로 표현한 형태다.
    • 계층형 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에서 제공되는 강의자료를 바탕으로 작성되었습니다.
profile
그림 그리는 백엔드 개발자

0개의 댓글