Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 메서드
- java변수
- for문
- 접근제어지시자
- IntelliJ IDEA
- JAVA객체지향
- 메서드 오버로딩
- function
- 반복문
- 자바 멀티스레딩
- 인텔리제이 기초 설정
- 인텔리제이 한글 깨짐 해결법
- this예약어
- Thread
- While
- OPP개념
- 컴파일
- 포함관계
- JAVA기초
- break문
- continue문
- 상수
- 형 변환
- 연관관계
- multi-threading
- 시스템 환경 변수 편집
- Java데이터 타입
- 집합관계
- 생성자
- Java
Archives
- Today
- Total
최원종의 개발 블로그
JSON 파싱 - HTTP-3 본문
파싱처리
HTTP 응답으로 받은 JSON 은 결국 문자열(String)
{"userId":1,"id":1,"title":"Java 공부","completed":false}
//위 문자열에서 title 값만 꺼내려면
방법 1: split(), indexOf() 로 직접 잘라내기
→ 복잡하고 오류 나기 쉬움
방법 2: GSON 라이브러리 사용
→ 간단하고 안전
파싱(Parsing)
파싱이란 문자열을 분석해서 원하는 구조로 변환하는 과정
자바 객체 <------- JSON 문자열 (fromJson)
자바 객체 --------> JSON 문자열 (toJson)
실습 준비 - GSON + Lombok JAR 추가
https://chl6698.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F#
티스토리
좀 아는 블로거들의 유용한 이야기, 티스토리. 블로그, 포트폴리오, 웹사이트까지 티스토리에서 나를 표현해 보세요.
www.tistory.com
실습 코드
1. DTO 클래스 설계
package http.gson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Todo {
private int userId;
private int id;
private String title;
private String body;
private boolean completed;
}
2. JSON Object 파싱 (단건 조회)
package http.gson;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class TodoClient {
public static void main(String[] args) {
//통신할 주소 : https://jsonplaceholder.typicode.com/todos/1
//단건 조회 -> JSON Object { } 응답 됨.
String urlString = "https://jsonplaceholder.typicode.com/todos/100";
HttpURLConnection connection;
try {
URL url = new URL(urlString); //문자열 형태의 주소를 실제 URL 객체로 만들고
connection = (HttpURLConnection) url.openConnection();//그 URL로 HTTP 연결을 여는 코드
//HTTP 요청 메세지 만들어서 --> 연결 요청
connection.setRequestMethod("GET");
//내가 설정하지 않더라도 기본적인 설정이 구축되어 있음
//바로 연결 요청
int responseHttpCode = connection.getResponseCode();// 통신
System.out.println("통신 성공 여부 확인 : " + responseHttpCode);
//응답 본문 추출
try (BufferedReader reader = new BufferedReader
(new InputStreamReader(connection.getInputStream()))) {
StringBuffer responseBody = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
responseBody.append(line);
}
//StringBuffer --> 문자열로 형 변환 toString() 호출 or "" 문자열 더하기( + "")
String jsonString = responseBody.toString();
System.out.println("JSON 응답 : " + responseBody);
//자바 프로그램 사용하려면 JSON 형식 텍스트를 파싱 처리해야한다
//GSON 라이브럴리 사용 - 사용방법
Gson gson = new Gson();
// Java 객체 변환 <--- json 문자열
//변환 하고자 하는 json 형식에 문자열 < --- 1번째 인수 값
// 변환 하고자 하는 DTO 타입
Todo todo = gson.fromJson(jsonString, Todo.class);
//Gson lib 활용해서 간단히 파싱 처리하고 우리 자바에서 쓰는 데이터 타입으로 활용 가능
System.out.println("-----------------------");
System.out.println(todo.getId());
System.out.println(todo.getUserId());
System.out.println(todo.getTitle());
System.out.println(todo.toString());
}
} catch (Exception e) {
System.out.println("통신실패 : " + e.getMessage());
}
}
}
3. JSON Array 파싱 (목록 조회)
package http.gson;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
public class TodoClient2 {
public static void main(String[] args) {
//통신할 주소 : https://jsonplaceholder.typicode.com/todos
//여러 건 조회 -> JSON Array [ { }, { }, { }, { },...]
String urlString = "https://jsonplaceholder.typicode.com/todos";
HttpURLConnection connection;
try {
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
//HTTP 요청 메세지 만들어서 --> 연결 요청
connection.setRequestMethod("GET");
//내가 설정하지 않더라도 기본적인 설정이 구축되어 있음
//바로 연결 요청
int responseHttpCode = connection.getResponseCode();// 통신
System.out.println("통신 성공 여부 확인 : " + responseHttpCode);
//응답 본문 추출
try (BufferedReader reader = new BufferedReader
(new InputStreamReader(connection.getInputStream()))) {
StringBuffer responseBody = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
responseBody.append(line);
}
//StringBuffer --> 문자열로 형 변환 toString() 호출 or "" 문자열 더하기( + "")
String jsonString = responseBody.toString();
System.out.println("JSON Array 응답 : " + responseBody);
//자바 프로그램 사용하려면 JSON 형식 텍스트를 파싱 처리해야한다
//JSON Array 파싱
//TypeToken : List<Todo> 처럼 제네릭 타입을 파싱할 때 사용
Gson gson = new Gson();
TypeToken<List<Todo>> typeToken = new TypeToken<>() {};
List<Todo> todoList = gson.fromJson(jsonString, typeToken.getType());
System.out.println("전체 개수 : " + todoList.size() + "개");
//200 개 중에 앞에 있는 3개만 출력
for (int i = 0; i < todoList.size(); i++) {
System.out.println(todoList.get(i));
}
}
} catch (Exception e) {
System.out.println("통신실패 : " + e.getMessage());
}
}
}
Object vs Array 파싱 비교
// JSON Object 파싱 (단건) → { 로 시작
Todo todo = gson.fromJson(jsonString, Todo.class);
// JSON Array 파싱 (목록) → [ 로 시작
TypeToken<List<Todo>> typeToken = new TypeToken<List<Todo>>() {};
List<Todo> todoList = gson.fromJson(jsonString, typeToken.getType());
toJson 역방향 연습 실습 코드
파싱(fromJson)의 반대 방향.
자바 객체를 JSON 문자열로 변환
package http.toJson;
import com.google.gson.Gson;
import lombok.Data;
public class ToJsonEx {
public static void main(String[] args) {
//자바 객체 생성 ---> 텍스트 형식인 json 변환
Post post = new Post();
post.setUserId(1);
post.setId(10);
post.setTitle("자바 공부");
post.setBody("JSON 파싱 연습");
Gson gson = new Gson();
String jsonPost = gson.toJson(post);
System.out.println(jsonPost);
//jsonPost 를 다시 역방향으로 변경
Post rePost = gson.fromJson(jsonPost, Post.class);
System.out.println(rePost);
}
}
@Data
class Post {
private int userId;
private int id;
private String title;
private String body;
}
도전과제 코드
도전 1 - 완료된 Todo 만 필터링해 보세요 ( 결과에서 completed = true 인 것만 골라서 출력 )
package http.gson;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
public class TodoClientEx {
public static void main(String[] args) {
// 통신할 주소
String urlString = "https://jsonplaceholder.typicode.com/todos";
HttpURLConnection connection;
try {
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
// HTTP 요청 메서드 설정
connection.setRequestMethod("GET");
// 연결 요청 및 응답 코드 확인
int responseHttpCode = connection.getResponseCode();
System.out.println("통신 성공 여부 확인 : " + responseHttpCode);
// 응답 본문 추출
try (BufferedReader reader = new BufferedReader
(new InputStreamReader(connection.getInputStream()))) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
responseBody.append(line);
}
String jsonString = responseBody.toString();
// Gson을 이용한 JSON Array 파싱
Gson gson = new Gson();
TypeToken<List<Todo>> typeToken = new TypeToken<>() {};
List<Todo> todoList = gson.fromJson(jsonString, typeToken.getType());
// --- 데이터 처리 및 출력 로직 시작 ---
int totalCount = todoList.size(); // 전체 개수
int completedCount = 0; // 완료된 총 개수
int printLimit = 5; // 출력할 제한 개수
int currentPrintCount = 0; // 현재까지 출력된 개수
// 출력을 위해 미리 담아둘 리스트 혹은 StringBuilder
StringBuilder printContent = new StringBuilder();
for (Todo todo : todoList) {
// 도전 1: completed가 true인 것만 필터링
if (todo.isCompleted()) {
completedCount++;
// 처음 5개까지만 문자열로 저장
if (currentPrintCount < printLimit) {
printContent.append(todo.toString()).append("\n");
currentPrintCount++;
}
}
}
// 결과 출력
System.out.println("전체: " + totalCount + "개");
System.out.println("완료된 Todo: " + completedCount + "개");
System.out.println("\n[완료된 Todo 처음 " + printLimit + "개]");
System.out.println(printContent.toString());
// --- 데이터 처리 및 출력 로직 끝 ---
}
} catch (Exception e) {
System.out.println("통신실패 : " + e.getMessage());
e.printStackTrace();
}
}
}
User에 내부 필드 클래스 타입들이 외부에 존재할 때 사용 법
-ToJsonUser코드
package http.toJson;
import com.google.gson.Gson;
import http.parsing.Address;
import http.parsing.Company;
import http.parsing.Geo;
import http.parsing.User;
//외부 클래스에 User 설계 했을 때
public class ToJsonUser {
public static void main(String[] args) {
User user = new User();
Address address = new Address();
Geo geo = new Geo();
Company company = new Company();
user.setId(1);
user.setName("홍길동");
user.setEmail("a@naver.com");
user.setAddress(address);
address.setCity("부산");
address.setStreet("중앙대로");
user.getAddress().setGeo(geo);
geo.setLat("123.1");
geo.setLng("44.5");
user.setCompany(company);
user.getCompany().setName("코리아IT");
// 객체 --->(직렬화) JSON 텍스트 형식
Gson gson = new Gson();
String userJson = gson.toJson(user);
System.out.println(userJson);
}
}
User 안에 인스턴스 내부 클래스로 설계 했을 경우
-User 코드
package http.toJson;
import lombok.Data;
//User안에 내부 클래스 설계 했을 때
@Data
public class User {
private int id;
private String name;
private String email;
private Address address;
private String phone;
private String website;
private Company company;
@Data
public class Address {
private String street;
private String suite;
private String city;
private String zipcode;
private Geo geo;
@Data
public class Geo {
private String lat;
private String lng;
}
}
@Data
public class Company {
private String name;
private String catchPhrase;
private String bs;
}
}
User DTO 클래스를 내부 클래스에 필드를 만들었을 경우 사용법
package http.toJson;
public class UserEx1 {
public static void main(String[] args) {
//User DTO 클래스를 내부 클래스에 필드를 만들었을 경우 사용법
User user = new User();
user.setId(100);
user.setName("홍길동");
user.setEmail("a@naver.com");
System.out.println(user.getId());
System.out.println(user.getName());
System.out.println(user.getEmail());
// User 안에 있는 Address 객체를 생성하는 방법
User.Address address = user.new Address();
address.setCity("부산");
address.setStreet("중앙대로");
user.setAddress(address);
System.out.println(address.getCity());
System.out.println(address.getStreet());
User.Address.Geo geo = user.getAddress().new Geo();
address.setGeo(geo);
geo.setLat("55.6");
geo.setLng("112.6");
System.out.println(geo.getLat());
System.out.println(geo.getLng());
}
}
내부 클래스에 static 클래스 선언도 가능
package http.toJson;
import lombok.Data;
@Data
public class User2 {
private int id;
private String name;
private String email;
private Address address;
private String phone;
private String website;
private Company company;
@Data
public static class Address {
private String street;
private String suite;
private String city;
private String zipcode;
private Geo geo;
@Data
public static class Geo {
private String lat;
private String lng;
}
}
@Data
public static class Company {
private String name;
private String catchPhrase;
private String bs;
}
}
-User2Ex
package http.toJson;
import com.google.gson.Gson;
public class User2Ex {
public static void main(String[] args) {
User2 user2 = new User2();
User2.Address address = new User2.Address();
User2.Address.Geo geo = new User2.Address.Geo();
User2.Company company = new User2.Company();
user2.setAddress(address);
user2.getAddress().setGeo(geo);
user2.setCompany(company);
Gson gson = new Gson();
String user2Json = gson.toJson(user2);
System.out.println(user2Json);
}
}
'Java > JAVA 유용한 클래스' 카테고리의 다른 글
| HTTP Client 연습 - 5 (0) | 2026.04.01 |
|---|---|
| 공공데이터 API 실습 - HTTP - 4 (0) | 2026.04.01 |
| JSON - HTTP - 2 (0) | 2026.03.31 |
| HTTP- 1 (0) | 2026.03.31 |
| 컬렉션 프레임워크 실습 - 회원 관리 시스템 (0) | 2026.03.31 |







