나는 Spring Boot 프로젝트를 할 때 적용했지만 어차피 Spring Boot에 국한된 기능이 아닌 Java의 기능이니 Java 기준으로 설명하겠다.
준비
Intellij에서 Java Gradle 프로젝트를 생성해준다.
Object Mapper를 사용하기 위해서 Jackson 모듈이 필요한데 Java면 gradle에 추가해줘야 한다.
Spring Boot라면 org.springframework.boot:spring-boot-starter-web
모듈에 포함되어 있다고 한다.
그리고 개발 편의성을 위해 Lombok도 추가해 준다.
Sample Data
적당히 depth가 있는 JSON File을 만들어서 resources/json/data.json
에 위치 시킨다.
{
"name": "ZungTa",
"age": 10,
"friends": [
{
"name": "alice",
"age": 11,
"my-favorite": {
"foods": ["rice"],
"games": ["monster hunter world", "dark souls"]
}
}
]
}
DTO 준비
JSON 문자열을 Parsing 해서 객체로 만들 것이기 때문에 매칭되는 Class를 만들어준다.
첨부된 코드는 package나 import 정보는 생략했다.
User.java
@Getter
public class User {
String name;
int age;
List<Friend> friends;
}
Friend.java
@Getter
public class Friend {
String name;
int age;
@JsonProperty("my-favorite")
Favorite favorite;
}
Favorite.java
@Getter
public class Favorite {
String[] foods;
String[] games;
}
File 읽기
파일은 File 객체를 생성해서 파일을 불러오면 된다.
File jsonDataFile = new File(System.getProperty("user.dir") + "/src/main/resources/json/data.json");
Object Mapper 생성
Java에서는 new 키워드로 인스턴스 새로 생성하면 되고 Spring Boot에서는 DI (Dependency Injection) 받으면 된다.
ObjectMapper objectMapper = new ObjectMapper();
Parsing
매우 간단하다.
ObjectMapper
로 readValue
하면 된다. 예외 처리 해줘야 한다.
실제 객체와 JSON 형식이 안 맞거나 문제가 되면 에러가 발생하니 그런 부분은 실제 사용하면서 적절히 예외 처리 해주면 된다.
User user;
try {
user = objectMapper.readValue(jsonDataFile, User.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
사용
객체 사용 하듯이 사용하면 된다.
간단히 내용물 출력하는 사용 예제를 작성했다.
System.out.println("name: " + user.getName());
System.out.println("age: " + user.getAge());
for (int i=0; i<user.getFriends().size(); i++) {
Friend friend = user.getFriends().get(i);
String friendsIndex = "friends[" + i + "]";
System.out.println(friendsIndex);
System.out.println(friendsIndex + ".name: " + friend.getName());
System.out.println(friendsIndex + ".age: " + friend.getAge());
// favorite
System.out.println(friendsIndex + ".my-favorite.foods: " + Arrays.toString(
friend.getFavorite().getFoods()));
System.out.println(friendsIndex + ".my-favorite.games: " + Arrays.toString(
friend.getFavorite().getGames()));
}
DTO 작성 다른 방법
inner class
를 활용해서 한 파일에 Class들을 생성할 수 있다.
이름은 구분하기 위해서 User2
로 지었다.
User2.java
@Getter
public class User2 {
String name;
int age;
List<Friend> friends;
@Getter
public static class Friend {
String name;
int age;
@JsonProperty("my-favorite")
Favorite favorite;
@Getter
public static class Favorite {
List<String> foods;
List<String> games;
}
}
}
기타 참고사항
JsonProperty
는 실제 JSON의 key값이랑 class의 property의 이름을 다르게 설정하고 싶거나 json key 값을 그대로 쓸 수 없는 경우에 사용해주면 된다. (e.g.my-favorite
)- Example Github