Wisdom기록보관소
Java Json을 파싱하고 이용해보자! 본문
JSON ( 제이슨 Javascript Object Notation ) 자바스크립트가 뿌리가 되서 나온 형식의 형싱으로 Http 통신이나 다른 통신에서 데이터를 보내고 받을때 표현하는 방법?정도라고 이해
내가 사용하는 부분에서느 문자열 형태로 오는것을 다시 Java 객체에 담아서 이용하는 형식이다.
Spring boot에서는 기본으로 Jackson 라이브러리를 이용하여 문자열과 Java객체간 변환을 하는 것으로 보인다.
그래서 Jackson 라이브러리 사용법을 적어본다.
간략한 용어설명.
Serialize 직렬화 - 객체를 전송가능한 문자열 형식으로 만들어 주는것!
Deserialize 역직렬화 - JSON형식의 문자열을 Java 객체로 변환!
아주아주아주아주 간단한하고 지금 바로 필요한 기능만 적어놓겠다.
직렬화
class Reviews{
public String reviewId;
public String writerName;
public String createDate;
public String thumnailUri;
}
위와 같은 아주간단한 정보를 담는 클래스가 있다. 이것을 JSON문자열로 바꾸려면
public class JacksonTest {
@Test
public void test(){
ObjectMapper objectMapper = new ObjectMapper();
Reviews reviews = new Reviews();
reviews.createData = "test";
reviews.reviewId = " 123";
reviews.thumnailUri = "rtsert";
reviews.writerName = "test name";
try {
String testResult = objectMapper.writeValueAsString(reviews);
System.out.println(testResult);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
위와 같이 ObjectMapper 클래스를 이용하여 변환 할 수 있다.
아래는 string을 찍어 봤을때 결과 값
{"reviewId":" 123","writerName":"test name","createData":"test","thumnailUri":"rtsert"}
아주 잘 나온다. 주의할 점은 직렬화 할 클래스의 들의 접근을 public 혹은 getter매서드를 만들어 주어야 jackson 이 이를 찾아서 쓴다고 한다. 실제로도 명시를 안하거나 Getter가 없는데 private 한다거나 하면 에러를 던져주었다.
여기서 좀 더 원하는 기능으로 나아가자.
위와 같이만 사용하면 직렬화시에 null 값이 들어가면 해당 값에 null이라고 찍히게 된다. 나는 없는 값이면 그냥 그 property?를 아예 안찍었으면 좋겠는데...
{"reviewId":" 123","writerName":"test name","createData":"test","thumnailUri":null}
그럴때 @JsonInclude 어노테이션을 사용해주자~!
@JsonInclude(JsonInclude.Include.NON_NULL)
class Reviews{
public String reviewId;
public String writerName;
public String createDate;
public String thumnailUri;
}
JsonInclude.Include.NON_NULL 이 옵션을 주면 null이 아닌것만 포함해서 만들라는 말 되시겠다. 결과는 생략.
이제는 역직렬화.
문자열을 내가 원하는 객체에 맞게 만들어주는거!
public class JacksonTest {
@Test
public void test(){
ObjectMapper objectMapper = new ObjectMapper();
String testInput = "{\"reviewId\":\" 123\",\"writerName\":\"test name\",\"createData\":\"test\",\"thumnailUri\":null}";
try {
Reviews reviews = objectMapper.readValue(testInput, Reviews.class);
System.out.println(reviews);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
요것도 ObjectMapper 클래스의 readValue 매서드를 사용하면 간단히 된다. toString 을 정의해서 찍어보면.
Reviews{reviewId=' 123', writerName='test name', createData='test', thumnailUri='null'}
아주 잘 만들어준다. 저 thumnailUri라는 프로퍼티의 'null'이라고 문자를 찍지만 혹시나 해서 확인해 보면 null이다.
해당 변수는 null이다. 잘 되고 있다.
이제 해당 클래스에 정의되지 않은 변수가 들어오면 어떻게 될까?
"{\"reviewId\":\" 123\",\"writerName\":\"test name\",\"createData\":\"test\",\"thumnailUri\":null, \"noProperty\":\"what\"}"
위와 같은 문자열을 넣어보았다.
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "noProperty"
에러를 발생시킨다. 없는 key 값이 오면 에러를 발생 시키는게 기본값으로 되어있나보다.
이역시 어노테이션 한방이면 해결된다.
@JsonIgnoreProperties(ignoreUnknown = true)
작성 되어 있는것처럼 모르는 것은 무시하자! 라는 옵션을 주면 아는것만 집어 넣고 모르는것은 버린다.
현재 필요한것은 이정도면 되었는데 더 복잡한 경우나 혹은 위와 같은 옵션은 현업에서 사용하면 문제가 발생한다거나 하는 등은 아직 고려해보지 않아서 누군가 피드백 좀 해줬으면 좋겠지만...
한풀이는 여기까지 하고 아무튼 추가적으로 필요한 부분이 나오면 사용법이 나오면 업데이트 해야지.
'Study! > SpringBoot' 카테고리의 다른 글
SpringBoot Logging을 하자!! (0) | 2021.03.15 |
---|---|
Oauth2를 이해하고 적용해보자! (0) | 2021.03.15 |
Spring Boot JPA 사용하기 - Entity ! (0) | 2020.08.06 |
Spring Boot . Spring Security 사용하기 (0) | 2020.07.30 |
Spring Boot JPA 사용하기 (0) | 2020.07.29 |