최원종의 개발 블로그

JSON 파싱 - HTTP-3 본문

Java/JAVA 유용한 클래스

JSON 파싱 - HTTP-3

chl6698 2026. 4. 1. 11:53

파싱처리  

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