특정객체를 json으로 바꾸어놓을 때 사용한다.(직렬화
) 또는 그 반대로 바꾸어놓을 때 사용한다.(역직렬화
)
스프링에서는 이미 @RequestBody
로 객체가 json 으로 바뀌어서 받는다. 그래서 따로 ObjectMapper를 활용하지 않는다.
하지만 Json 자체 데이타에서 컨트롤하는 상황이나 Rest Controller단 테스트코드를 작성할 때 사용할 수 있다.
ObjectMapper로 직접 json 데이타에 접근하는 방법을 배워보자.
자바프로그램에서는 이 3개를 다 깔아줘야 한다.
jackson-databind-2.12.7.1.jar
jackson-core-2.12.7.jar
jackson-annotations-2.12.7.jar
💥 주의!
spring에서 사용하는 objectMapper 디팬더시는Jackson Databind
이다!
따로 스프링에서 디팬더시를 걸어주지 않아도 된다.
Jackson Databind 디팬더시는 기본적으로 깔려 있다.
Jackson
은 Java용 견고하고 성숙한 JSON 직렬화/역직렬화 라이브러리이다.ObjectMapper
의 API는 많은 유연성과 JSON 응답 객체를 구문 분석하고 생성하는 간단한 방법을 제공하는 것이다.ObjectMapper로 접근하기
역직렬화를 위해서는 기본생성자
가 반드시 필요하다.
1) 객체 -> JSON(String) : 직렬화, Response
writeValueAsString(user)
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
String json = objectMapper.writeValueAsString(user); // String(json)으로 변환
2) JSON(String) -> 객체 : 역직렬화, Request
readValue (json, User.class)
String json = "{\"name\":\"zooneon\",\"age\":25,\"address\":\"seoul\"}";
User returnUser = objectMapper.readValue(json, User.class);
sample.json
{
"name": [
"dsg22",
"dsg333"
],
"age": 15,
"cars": [
{
"name": "K5",
"carNumber": "11rk 1111",
"type": "sedan"
},
{
"name": "Q5",
"carNumber": "22rk 2222",
"type": "SUV"
}
]
}
User.java
@Data
@NoArgsConstructor
public class User {
private String name;
private int age;
private List<Car> cars;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public User(String name, int age, List<Car> cars) {
this.name = name;
this.age = age;
this.cars = cars;
}
}
Car.java
@JsonProperty
로 카멜케이스 -> 스네이크기법으로 바꿈
@Data
public class Car {
private String name;
@JsonProperty("car_number")
private String carNumber;
@JsonProperty("TYPE")
private String type;
}
main문
System.out.println("main##########");
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setAge(15);
Car car1 = new Car();
car1.setName("K5");
car1.setCarNumber("11rk 1111");
car1.setType("sedan");
Car car2 = new Car();
car2.setName("Q5");
car2.setCarNumber("22rk 2222");
car2.setType("SUV");
List<Car> carList = Arrays.asList(car1, car2);
user.setCars(carList);
System.out.println(user);
// 1) object -> json
String json = objectMapper.writeValueAsString(user);
System.out.println("json: " + json);
결과
접근방법
JsonNode jsonNode = objectMapper.readTree(json);
JsonNode cars = jsonNode.get("cars");
ArrayNode arrayNode = (ArrayNode) cars;
Json 데이타 변경 방법
ObjectNode objectNode = (ObjectNode) jsonNode;
put()으로 변경
objectNode.put("name", "steve");
objectNode.put("age", 24);
Json 데이타 확인
objectNode.toPrettyString()
main
// 2) JsonNode로 접근하기!
JsonNode jsonNode = objectMapper.readTree(json);
String _name = jsonNode.get("name").asText();
int _age = jsonNode.get("age").asInt();
System.out.println("name :" + _name);
System.out.println("age :" + _age);
JsonNode cars = jsonNode.get("cars"); // String으로 못받음!
ArrayNode arrayNode = (ArrayNode) cars; // Array 타입으로 파싱
List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {
}); // List타입으로 convert
System.out.println("_cars :" + _cars);
// JsonNode를 쓰는 이유! 이렇게 변경이 가능!
ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.put("name", "steve");
objectNode.put("age", 24);
System.out.println("objectNode: " + objectNode.toPrettyString());
console
_cars :[Car(name=K5, carNumber=11rk 1111, type=sedan), Car(name=Q5, carNumber=22rk 2222, type=SUV)]
objectNode: {
"name" : "steve",
"age" : 24,
"cars" : [ {
"name" : "K5",
"car_number" : "11rk 1111",
"TYPE" : "sedan"
}, {
"name" : "Q5",
"car_number" : "22rk 2222",
"TYPE" : "SUV"
} ]
}
따로 더 깊은 내용은 이 블로그를 참조하길 바란다.
https://pjh3749.tistory.com/m/281
https://velog.io/@zooneon/Java-ObjectMapper를-이용하여-JSON-파싱하기
패스트캠퍼스 스프링 예상국 강의