스프링이 3.0 이후로 Jackson과 관련된 API를 제공해서 우리가 코드를 직접 작성해서 JSON 데이터를 처리하지 않아도 된다고 함
external libraries 에 jackson이라는 라이브러리가 자동으로 추가되어있음
따로 dependencies에 추가하지 않아도 이미 사용하고 있음
스프링에서 처리되는거 이외에도 직접 코드를 사용해서 JSON 형태로 바꾼다거나 JSON 형태로 넘어온 Object를 바꿔줘야 하는 경우가 종종 생김
test→ JacksonTest 만듦
package com.sparta.springmvc;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sparta.springmvc.response.Star;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class JacksonTest {
@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
Star star = new Star("Robbie", 95);
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
String json = objectMapper.writeValueAsString(star);
System.out.println("json = " + json);
}
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
String json = "{\\"name\\":\\"Robbie\\",\\"age\\":95}"; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
Star star = objectMapper.readValue(json, Star.class);
System.out.println("star.getName() = " + star.getName());
}
}
@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
Star star = new Star("Robbie", 95);
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
String json = objectMapper.writeValueAsString(star);//Object를 Json으로
System.out.println("json = " + json);
}
Get method 필요 → 변환을 할때 Getter를 사용한다 함
//@Getter
public class Star {
String name;
int age;
public Star(String name, int age) {
this.name = name;
this.age = age;
}
public Star() {}
}
Star클래스에서 Getter를 주석처리하면
Test가 작동하지 않는다
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.sparta.springmvc.response.Star and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
No serializer found → serialize : 객체 형태의 값을 String값으로 바꿈(Object to JSON) 하는 것
무조건 변환이 가능한 게 아니라 Object Mapper로 사용할때 Getter등과 같이 필요한 요구조건들이 있음
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
String json = "{\\"name\\":\\"Robbie\\",\\"age\\":95}"; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
Star star = objectMapper.readValue(json, Star.class);// Star.class: Star 객체로 만들거라고 지정
System.out.println("star.getName() = " + star.getName());
System.out.println("star.getAge() = " + star.getAge());
}
기본생성자를 주석처리해봄
@Getter
public class Star {
String name;
int age;
public Star(String name, int age) {
this.name = name;
this.age = age;
}
//
// public Star() {}
}
그리고 Test2를 수행하면
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.sparta.springmvc.response.Star (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
이런 에러가 뜬다
deserialize : Sting→Object
Getter를 주석처리하고 Test2를 수행하면
내부적으로 Getter를 사용하기 때문에 field가 없다고 에러가 뜸
Setter를 Getter 대신 달아주면 동작함
name 에서 e를 빼고 돌려봄
void test2() throws JsonProcessingException {
String json = "{\\"nam\\":\\"Robbie\\",\\"age\\":95}"; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
Star star = objectMapper.readValue(json, Star.class);
System.out.println("star.getName() = " + star.getName());
System.out.println("star.getAge() = " + star.getAge());
}
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "nam" (class com.sparta.springmvc.response.Star), not marked as ignorable (2 known properties: "name", "age"]) 이런 에러가 뜨게 됨
필드명과 정확하게 일치해야 인식할 수 있다 함
협업할 때 주의해야 한다고 함
'TIL(Develop)' 카테고리의 다른 글
HTTP 데이터를 객체로 처리하는 방법 (0) | 2023.11.07 |
---|---|
Path Variable과 Request Param (0) | 2023.11.06 |
데이터를 클라이언트에게 반환하는 방법 (0) | 2023.11.06 |
정적페이지와 동적페이지 (1) | 2023.11.03 |
Controller이해하기 (0) | 2023.11.02 |