특정객체를 json으로 바꾸어놓을 때 사용한다.
(직렬화
) 또는 그 반대로 바꾸어놓을 때 사용한다.(역직렬화
)
스프링에서는 이미 @RequestBody
로 객체가 json 으로 바뀌어서 받는다. 그래서 따로 ObjectMapper를 활용하지 않는다.
하지만 Json 자체 데이타에서 컨트롤하는 상황이나 Rest Controller단 테스트코드를 작성할 때 사용할 수 있다.
ObjectMapper로 직접 json 데이타로 만드는 방법을 배워보자.
순수 Java 프로그램에서는 이 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-파싱하기
Gson은 Google에서 개발한 자바 라이브러리로, JSON 데이터와 자바 객체 간의 직렬화 및 역질렬화를 처리하는 데 사용된다. Jackson의 ObjectMapper랑 같이 json 처리의 많이 사용되는 라이브러리이다.
maven
https://mvnrepository.com/artifact/com.google.code.gson/gson/2.10.1
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'
// Person -> json
Gson gson = new Gson();
Person p = new Person("홍길동", 20, "ms@naver.com");
String gJson = gson.toJson(p);
System.out.println(gJson);
// json -> Person
Person p2 = gson.fromJson(gJson, Person.class);
System.out.println(p2);
성능: Jackson이 대용량 데이터 처리에서 더 나은 성능을 보입니다1.
기능성: Jackson은 다양한 데이터 형식을 지원하며, 더 많은 기능을 제공합니다1.
사용 편의성: Gson은 설정이 간단하고 사용이 쉬워, 간단한 JSON 작업에 적합합니다1.
결론
Jackson: 대용량 데이터 처리, 다양한 데이터 형식 지원, 고급 기능이 필요한 경우 추천.
Gson: 간단한 JSON 작업, 빠른 시작이 필요한 경우 추천.