웹상에서 데이터를 주고 받을때 공통된 오브젝트를 사용한다면 서로가 한번만 변환을 해서 데이터를 사용할 수가 있다 ( 여러번 변환할 필요가 없다 ! )
( 이해하기 쉽게 말하자면 다양한 언어를 배우지말고 영어 하나만 공용어로 사용하자 )
이러한 오브젝트중에서 json 오브젝트를 파싱하는 방법에 대해 알아보자
( 본 포스팅에서 사용하는 URI주소들에는 아래와 같은 json파일들이 있다 )
`{"code":1,"msg":"목록보기완료","data":[{"id":2,"username":"cos","password":"","email":"cos@nate.com","created":"2023-01-08 13:42:07","updated":"2023-01-08 13:42:07"},{"id":1,"username":"ssar","password":"","email":"ssar@nate.com","created":"2023-01-08 13:42:07","updated":"2023-01-08 13:42:07"}]}`
json 파싱하기
먼저 파싱에 사용할 라이브러리를 build.gradle 에 추가
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9'
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.22'
// json의 데이터를 입력받을 클래스를 먼저 만든다
import java.util.ArrayList;
public class Response {
private int code;
private String msg;
private ArrayList<User> data;
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public ArrayList<User> getData() {
return data;
}
public class User {
private int id;
private String username;
private String password;
private String email;
private String created;
private String updated;
public int getId() {
return id;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getEmail() {
return email;
}
public String getCreated() {
return created;
}
public String getUpdated() {
return updated;
}
}
}
// main 메소드에서 json파일을 클래스 객체로 파싱
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/init/user");
HttpURLConnection stream = (HttpURLConnection) url.openConnection();
BufferedReader buf = new BufferedReader(
new InputStreamReader(stream.getInputStream()));
// 스트림을 통해 json을 버퍼에 저장
String result = "";
String str;
while ((str = buf.readLine()) != null) {
// System.out.println(str); // json 을 콘솔에 출력
result = result + str; // json의 내용을 String타입으로 저장
}
buf.close();
Gson gson = new Gson(); // gson 라이브러리 이용
Response response = gson.fromJson(result, Response.class);
// json의 데이터를 입력받은 Response 객체가 힙영역에 생성됨
System.out.println(response.getCode());
System.out.println(response.getMsg() + "\n");
ArrayList<User> data = response.getData();
for (User user : data) {
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getEmail());
System.out.println("--------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
결과는
1
목록보기완료
2
cos
cos@nate.com
--------------
1
ssar
ssar@nate.com
--------------
클래스를 만들때의 주의점은 json 의 변수이름과 동일한 변수이름으로 만들어야한다.
기본형 타입이 아니면 클래스나 리스트 타입으로 필드를 생성한다.
// URLtoString 메소드 생성
package myUtil;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MyUtil {
public static String URLtoString(String str) throws Exception {
URL url = new URL(str);
HttpURLConnection stream = (HttpURLConnection) url.openConnection();
String result = "";
try ( BufferedReader buf = new BufferedReader(
new InputStreamReader(stream.getInputStream()))) {
String string;
while ((string = buf.readLine()) != null) {
result += string;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
// json 데이터를 받을 클래스 생성
import java.util.ArrayList;
import lombok.Getter;
@Getter
public class First {
private int code;
private String msg;
public ArrayList<Second> data;
public class Second {
private int id;
private String title;
private String content;
private String created;
private String updated;
private Third user;
@Override
public String toString() {
return "\n" + String.valueOf(id) + "\n" + title + "\n" + content + "\n"
+ user;
}
}
class Third {
private String created;
private String updated;
@Override
public String toString() {
return "\n" + updated + "\n";
}
}
}
// main 실행
import com.google.gson.Gson;
import myUtil.MyUtil; // URLtoString 메소드 호출
public class BufferEx001 {
public static void main(String[] args) {
try {
String str = MyUtil.URLtoString("http://localhost:8080/init/post");
First fir = new Gson().fromJson(str, First.class);
System.out.println(fir.getData());
// toString 재정의해서 데이터 몇개만 출력했음
} catch (Exception e) {
e.getStackTrace();
}
}
}
결과는
[
5
제목5
내용5
2023-42-08T13:42:07
,
4
제목4
내용4
2023-42-08T13:42:07
,
3
제목3
내용3
2023-42-08T13:42:07
,
2
제목2
내용2
2023-42-08T13:42:07
,
1
제목1
내용1
2023-42-08T13:42:07
]
// URLtoString 메소드는 생략하겠다 위에 코드를 참고
// 클래스는 생략했다.
// 자동으로 만들어주는 사이트도 있는데 그 전에 직접 만드는데 익숙해지자.
// https://jsonplaceholder.typicode.com/users 주소를 이용했다. 여러분도 따라 해보자.
import java.util.Arrays;
import java.util.List;
import com.google.gson.Gson;
import myUtil.MyUtil;
public class SecondJson {
public static void main(String[] args) {
try {
String str = MyUtil.URLtoString(
"https://jsonplaceholder.typicode.com/users");
Gson gson = new Gson();
Root[] root = gson.fromJson(str, Root[].class); // 배열 오브젝트
List<Root> list2 = Arrays.asList(root);
System.out.println(list2); // toString 재정의로 모두 출력하게 했음
} catch (Exception e) {
e.getStackTrace();
}
}
}
결과는
[
id : 1
Leanne Graham
Bret
Sincere@april.biz
1-770-736-8031 x56442
hildegard.org
< Address >
Kulas Light
Apt. 556
Gwenborough
92998-3874
< Geo >
lat : -37.3159
lng : 81.1496
< Company >
Company Name : Romaguera-Crona
Company catchPhrase : Multi-layered client-server neural-net
Company bs : harness real-time e-markets
---------------------------------,
id : 2
Ervin Howell
Antonette
Shanna@melissa.tv
010-692-6593 x09125
anastasia.net
< Address >
Victor Plains
Suite 879
Wisokyburgh
90566-7771
< Geo >
lat : -43.9509
lng : -34.4618
< Company >
Company Name : Deckow-Crist
Company catchPhrase : Proactive didactic contingency
Company bs : synergize scalable supply-chains
---------------------------------,
// ( id는 10까지 이하 생략 )