- [Java] 109. JSON 파싱 연습 (2) - (1) Object2024년 06월 07일
- Song hyun
- 작성자
- 2024.06.07.:18
728x90반응형[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
728x90반응형'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 다음글이전글이전 글이 없습니다.댓글