[Java] 109. JSON 파싱 연습 (2) - Object
1. JSON Array-JSON Object 타입의 차이
2. JSON이란?
3. 파싱 연습하기: 2단계
1. JSON Array-JSON Object 타입의 차이
JSON Object(JSON 객체) | JSON Array(JSON 배열) |
JSON 객체는 {}로 둘러싸인 키-값 쌍의 집합이다. | JSON 배열은 []로 둘러싸인 값의 순서 있는 목록이다. |
키는 항상 문자열이고, 값은 문자열-숫자-객체-배열-불리언 혹은 null일 수 있다. | 배열의 각 값은 모든 JSON 데이터 타입이 될 수 있다. |
2. JSON이란?
(1) JSON 은 대괄호({}), 중괄호([])로 이루어져 있다.
-{}: JSON Object 형태
-[]: JSON Array 형태
-각각의 형태에 맞는 코드를 작성해야 한다. (=> JSON의 형태를 파악해야 한다.)
*DTO 클래스(Data Transfer Object): DTO 객체는 데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체이다. 데이터베이스에서 데이터를 얻어, service/controller로 보낼 때 사용되는 객체이다.
*매핑(mapping): 하나의 값을 다른 값으로 대응시키는 것.
3. 파싱 연습하기: 2단계
이번 파싱 연습에서는 두 개의 클래스 파일이 필요하다.
(1) 하나는 JSON 데이터를 파싱할 클래스 (=인스턴스화에 사용),
(2) 하나는 URL, I/O 스트림을 생성 / JSON 데이터를 파싱할 클래스 파일이다.
(*파싱할 주소: https://jsonplaceholder.typicode.com/albums/1)
(1) 클래스 파일 만들기
-멤버변수 선언하기
-Getter,Setter 메서드 및 생성자 만들기 (Gson,Lombok 사용)
: 데이터를 파싱한 뒤, 보기 좋게 인스턴스화 할 때 쓰이는 클래스 파일이다.
: 파싱에 필요한 멤버변수(userId/id/title),Getter/Setter 메서드, 생성자, ToString 등을 lombok 라이브러리로 생성한다.
@Setter
@Getter
@NoArgsConstructor // 기본 생성자(롬북)
@AllArgsConstructor
@ToString
public class Album {
private int userId;
private int id;
private String title;
}
(2) 경로와 URL 클래스 생성
-위의 사진을 보면 URLConnection의 하위 클래스 중에 HttpURLConnection이 있다. (=다운 캐스팅)
*TCP/IP 기반의 통신= 신뢰성 있는 통신. 내가 요청을 하면 반드시 응답을 해주는 방식이다. 정확하지만 속도가 느리다.
*UDP/IP 기반의 통신= 내가 몇 번을 요청하더라도, 응답이 오지 않을 수도 있다. 하지만 TCP/IP 방식보다 속도가 더 빠르다.
-첫번째로 데이터를 받아올 사이트를 URL 클래스에 담는다.
이후에 URL 객체에 담아둔 링크에 openCounnection() 메서드를 사용하고, 이를 다시 HttpURLConnection으로 다운캐스팅한다.
*openConnection(): 실제 네트워크 연결을 설정하지 않고, URLConnection 클래스의 인스턴스를 반환한다. (=어플리케이션-URL 간의 연결 관련 클래스들의 수퍼 클래스이다.) 프로토콜이 Http:// 인 경우, HttpURLConnection 객체로 캐스팅이 가능하다. connect()를 통해 네트워크 연결이 가능하다.
*setRequestMethod
*setRequestProperty
*responseCode(): 서버 응답 코드. 응답받은 숫자마다 각각의 고유한 의미가 있다.
package ch02;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLPermission;
public class MyHttpAlbumClient {
public static void main(String[] args) {
// 순수 자바 코드에서 HTTP 통신
// 1. 서버 주소 경로 (URL)
// 2. URL 클래스
// 3. url.openConnection() : 객체를 받아내서, 스트림 I/O
try {
URL url=new URL("https://jsonplaceholder.typicode.com/albums/1");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
// 응답 코드 확인
int responseCode=conn.getResponseCode();
System.out.println("Response code : "+responseCode);
} catch (IOException e) {
e.printStackTrace();
}
} // end of main
} // end of class
(3) I/O 스트림 생성 및 응답 메세지 추출하기
-기반 스트림(getInputStream) + 보조 스트림(InputStreamReader+BufferedReader) 생성 (데이터를 읽는 스트림)
-스트림을 사용해 데이터 읽기: readLine(), append()
package ch02;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLPermission;
public class MyHttpAlbumClient {
public static void main(String[] args) {
// 순수 자바 코드에서 HTTP 통신
// 1. 서버 주소 경로 (URL)
// 2. URL 클래스
// 3. url.openConnection() : 객체를 받아내서, 스트림 I/O
try {
URL url=new URL("https://jsonplaceholder.typicode.com/albums/1");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
// 응답 코드 확인
int responseCode=conn.getResponseCode();
System.out.println("Response code : "+responseCode);
// HTTP 응답 메세지에 데이터를 추출 [] --- Stream --- []
// inputStreamReader는 한 바이트가 아닌, 한 문자 씩 읽어주는 스트림이다.
// 일반적은 I/O 기반 스트림은 속도가 느리기 때문에, 보조 스트림을 사용한다.
// BufferedReader= 한 줄 씩 읽어내는 보조 스트림
BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer buffer=new StringBuffer();
// 한 번 생성되면 수정 x => 이뮤터블 (String)
// 한 번 생성된 뒤로도 수정 ok => 뮤터블 (StringBuffer+append)
while((inputLine=in.readLine())!=null) {
buffer.append(inputLine);
}
in.close();
System.out.println(buffer.toString());
} catch (IOException e) {
e.printStackTrace();
}
} // end of main
} // end of class
(4) gson 라이브러리 활용
-gson 라이브러리-fromJson()(json형태의 데이터를 다른 형태로 바꾸는 메서드) 사용하기
-fromJson(buffer.toString(),Album.class)사전에 만든 album() 인스턴스화 시킨다.
ㄴbuffer.toString(): 파싱할 대상
ㄴAlbum.class: '어떻게' 파싱할지?
package ch02;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLPermission;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class MyHttpAlbumClient {
public static void main(String[] args) {
// 순수 자바 코드에서 HTTP 통신
// 1. 서버 주소 경로 (URL)
// 2. URL 클래스
// 3. url.openConnection() : 객체를 받아내서, 스트림 I/O
try {
URL url=new URL("https://jsonplaceholder.typicode.com/albums/1");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
// 응답 코드 확인
int responseCode=conn.getResponseCode();
System.out.println("Response code : "+responseCode);
// HTTP 응답 메세지에 데이터를 추출 [] --- Stream --- []
// inputStreamReader는 한 바이트가 아닌, 한 문자 씩 읽어주는 스트림이다.
// 일반적은 I/O 기반 스트림은 속도가 느리기 때문에, 보조 스트림을 사용한다.
// BufferedReader= 한 줄 씩 읽어내는 보조 스트림
BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer buffer=new StringBuffer();
// 한 번 생성되면 수정 x => 이뮤터블 (String)
// 한 번 생성된 뒤로도 수정 ok => 뮤터블 (StringBuffer+append)
while((inputLine=in.readLine())!=null) {
buffer.append(inputLine);
}
in.close();
System.out.println(buffer.toString());
System.out.println("-----------");
// gson library 활용
Gson gson=new GsonBuilder().setPrettyPrinting().create();
// toJson(): 객체를 Json 문자열로 변환한다.
// fromJson(): Json 문자열을 객체(object)로 변환한다.
Album albumDTO=gson.fromJson(buffer.toString(), Album.class);
// 첫번째는 파싱할 대상, 두번째는 '어떻게 파싱할지'를 정한다.
// 즉, Album 클래스 형태로 Json 문자를 파싱한다는 뜻!
System.out.println(albumDTO.getId());
System.out.println(albumDTO.getUserId());
System.out.println(albumDTO.getTitle());
} catch (IOException e) {
e.printStackTrace();
}
} // end of main
} // end of class
'Java > 네트워크 통신' 카테고리의 다른 글
[Java] 111. Json 파싱하기 (2) - (3) Object+Array (0) | 2024.06.07 |
---|---|
[Java] 110. JSON 파싱 연습 (2) - (2) Array (0) | 2024.06.07 |
[Java] 108. jsonPlaceHolder 파싱하기 (0) | 2024.06.05 |
[Java] 107. 파싱/JSON 파싱 (0) | 2024.06.05 |
[Java] 106. 연습 문제: 오픈 API 사용해보기 (0) | 2024.06.04 |