본문 바로가기
Code/Console

[Java Code] Gson 클래스를 활용한 JSON Phasing

by 스응 2023. 3. 15.
728x90
728x90

준비물

  1) Gson

      1. https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.9에서 jar 다운받기

      2. 해당 프로젝트의 [Properties]로 들어가서 [Libraries] 탭 → [Modulepath] 선택

      3. 오른쪽의 [Add External JARs...] → jar 파일 선택

      4. 해당 프로젝트의 'module-info.java' 파일로 들어가서 아래 코드 입력

1
2
3
4
module 프로젝트명 {
    requires com.google.gson;
    opens 패키지명; // 지정된 패키지  
}
cs

 

  2) Json 연습용 데이터 사이트 : https://jsonplaceholder.typicode.com/users

 

 


사이트에서 데이터 읽어오기

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
// base url : https://jsonplaceholder.typicode.com/
// end point : todos
URL url = new URL("https://jsonplaceholder.typicode.com/users");
            
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET"); 
conn.connect(); // Get 방식으로 요청
            
// 응답
int statusCode = conn.getResponseCode();          // 404 : 통신 약속 (통신이 실패했다는 의미)
System.out.println("statusCode : " + statusCode); // 200 : 통신 약속 (통신이 성공했다는 의미)
            
// IO            
// conn.getInputStream() : 1 byte씩 데이터를 읽음 (읽기 대상 : url)
// BufferedReader() : 한 줄씩 데이터를 읽음 (\n 전까지)
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb = new StringBuffer();
String line = null;
            
// reader.readLine()은 null을 만나면 더 이상 읽을 데이터가 없다는 뜻
while (( line = reader.readLine() ) != null) {
    sb.append(line + "\n"); // 문자열 더하기
}
            
String resultStr = sb.toString(); // StringBuffer를 String 타입으로 변환
cs

 

JSON 데이터를 담을 클래스 설계

  - JSON 객체 내에 또다른 JSON 객체가 값으로 존재한다면, 따로 클래스로 정의해서 멤버 변수로 지정함

      → inner 클래스로 사용할 경우, static 키워드를 추가해주어야 함에 유의

더보기
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
public class User {
 
    private int id;
    private String name;
    private String username;
    private String email;
    private Address address;
    private String phone;
    private String website;
    private Company company;
 
    public static class Address {
        private String street;
        private String suite;
        private String city;
        private String zipcode;
        private Geo geo;
 
        public static class Geo {
            private String lat;
            private String lng;
 
            public String getLat() {
                return lat;
            }
 
            public void setLat(String lat) {
                this.lat = lat;
            }
 
            public String getLng() {
                return lng;
            }
 
            public void setLng(String lng) {
                this.lng = lng;
            }
 
            @Override
            public String toString() {
                return "Geo [lat=" + lat + ", lng=" + lng + "]";
            }
 
        }
 
        public String getStreet() {
            return street;
        }
 
        public void setStreet(String street) {
            this.street = street;
        }
 
        public String getSuite() {
            return suite;
        }
 
        public void setSuite(String suite) {
            this.suite = suite;
        }
 
        public String getCity() {
            return city;
        }
 
        public void setCity(String city) {
            this.city = city;
        }
 
        public String getZipcode() {
            return zipcode;
        }
 
        public void setZipcode(String zipcode) {
            this.zipcode = zipcode;
        }
 
        public Geo getGeo() {
            return geo;
        }
 
        public void setGeo(Geo geo) {
            this.geo = geo;
        }
 
        @Override
        public String toString() {
            return "Address [street=" + street + ", suite=" + suite + ", city=" + city + ", zipcode=" + zipcode
                    + ", geo=" + geo + "]";
        }
 
    }
 
    public static class Company {
        private String name;
        private String catchPhrase;
        private String bs;
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
 
        public String getCatchPhrase() {
            return catchPhrase;
        }
 
        public void setCatchPhrase(String catchPhrase) {
            this.catchPhrase = catchPhrase;
        }
 
        public String getBs() {
            return bs;
        }
 
        public void setBs(String bs) {
            this.bs = bs;
        }
 
        @Override
        public String toString() {
            return "Company [name=" + name + ", catchPhrase=" + catchPhrase + ", bs=" + bs + "]";
        }
 
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    public String getPhone() {
        return phone;
    }
 
    public void setPhone(String phone) {
        this.phone = phone;
    }
 
    public String getWebsite() {
        return website;
    }
 
    public void setWebsite(String website) {
        this.website = website;
    }
 
    public Company getCompany() {
        return company;
    }
 
    public void setCompany(Company company) {
        this.company = company;
    }
 
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", username=" + username + ", email=" + email + ", address="
                + address + ", phone=" + phone + ", website=" + website + ", company=" + company + "]";
    }
 
}
cs

 

생성할 JSON 객체가 하나인 경우

1
2
3
4
Gson gson = new Gson();
// gson.fromJson("파싱해야 할 문자열", 클래스); 
// 리플렉션 기법 (동적) : 컴파일 시점에 만들지 않고, 실행 시점에 만듦
User user = gson.fromJson(sb.toString(), User.class);
cs

 

생성할 JSON 객체가 여러 개인 경우 (ArrayList 활용)

1
2
Type listType = new TypeToken<List<User>>(){}.getType();
ArrayList<User> userList = gson.fromJson(str, listType);
cs

 

 


기타 메모

- 통신 약속
    1) 200 : 통신 성공
    2) 404 : 요청 URL이 없어서 통신 실패
- 리플렉션 기법 : 컴파일 시점에 만들지 않고, 실행 시점에 데이터 타입을 만듦

 

320x100
반응형

댓글