티스토리 뷰

Spring/Spring Basic

Spring : Jackson databind

Korean Eagle 2020. 5. 21. 00:27
728x90

1. Jackson은 Json과 xml을 자바 객체와 상호 변환해 주는 라이브러리이다.

  1-1 내부적으로 자바 클래스의 setter/getter를 호출하여 값을 할당해 준다.

  1-2 따라서 클래스 setter/getter를 반드시 작성해야 한다.

 

2. 라이브러리는 아래의 구문으로 추가할 수 있다.

 

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.11.0</version>
</dependency>

 

  2-1 이 라이브러리를 사용하는 간단한 포스트이다.

    2-1-1 아래 내용을 프로젝트 루트의 data/simple.json이라고 저장하고

 

{
  "id": 14,
  "firstName":"pilseong",
  "lastName": "Heo",
  "active": true,
  "address": {
    "street": "7 lucky seven street",
    "city": "Seongnam",
    "state": "Kyounggi",
    "zip": 13258,
    "country": "Korea"
  },
  "languages": ["Java", "JavaScript", "TypeScript"],
}

 

    2-1-2 위 json을 받을 수 있는 POJO클래스를 작성한다.

 

package pe.pilseong.jacksontest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
public class Student {
  
  private int id;
  
  private String firstName;
  
  private String lastName;
  
  private boolean active;
  
  private Address address;
  
  private String[] languages;
}


package pe.pilseong.jacksontest;

import lombok.Data;

@Data
public class Address {

  private String street;
  
  private String city;
  
  private String state;
  
  private int zip;
  
  private String country;
}

 

    2-1-3 아래는 실행할 메인 클래스이다.

      2-1-3-1 jackson의 ObjectMapper를 받아와 json이 저장된 파일을 읽어와 Student객체로 변환한다.

      2-1-3-2 중요한 점은 자바 클래스와 수신 받는 json 데이터가 완벽하게 매핑되어야 하는 점이다.

      2-1-3-3 완벽하게 일치하지 않으면 에러가 발생한다.

 

package pe.pilseong.jacksontest;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import com.fasterxml.jackson.databind.ObjectMapper;

public class App {
  public static void main(String[] args) {
    ObjectMapper mapper = new ObjectMapper();
    
    Student student = null;
    try {
      student = mapper.readValue(new File("data/sample.json"), Student.class);
    } catch (IOException e) {
      e.printStackTrace();
    }
    
    System.out.println("Student Name :: " + student.getFirstName()+ " " +student.getLastName());
    System.out.println("Is Avctive :: " + student.isActive());
    System.out.println("Address :: " + student.getAddress());
    System.out.println("Languages :: ");
    Arrays.stream(student.getLanguages()).forEach(System.out::println);
  }
}

 

      2-1-3-4 결과는 다음과 같다.

 

Student Name :: pilseong Heo
Is Avctive :: true
Address :: Address(street=7 lucky seven street, city=Seongnam, state=Kyounggi, zip=13258, country=Korea)
Languages :: 
Java
JavaScript
TypeScript

 

  2-2 완벽하게 구조가 일치하지 않아도 받을 수 있는 방법이 있다.

    2-2-1 아래 클래스처럼 클래스 선언 부분에 @JsonIgnoreProperties를 붙이고 ignoreUnknown을 true 설정한다.

    2-2-2 이렇게 하면 data에는 있지만 클래스에서 속성이 정의되어 있지 않는 경우는 그 데이터를 무시한다.

 

package pe.pilseong.jacksontest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Student {
  
  private int id;
  
  private String firstName;
  
  private String lastName;
  
  private boolean active;
  
  private Address address;
  
  private String[] languages;
}

 

  2-2-3 이 예제를 실행하기 위해서 데이터에 company 정보를 추가한다.

 

{
  "id": 14,
  "firstName":"pilseong",
  "lastName": "Heo",
  "active": true,
  "address": {
    "street": "7 lucky seven street",
    "city": "Seongnam",
    "state": "Kyounggi",
    "zip": 13258,
    "country": "Korea"
  },
  "languages": ["Java", "JavaScript", "TypeScript"],
  "company": "Seoul Government"
}

 

  2-2-3 이렇게 하면 실행 결과는 이전과 동일하게 나온다. @JsonIgnoreProperties가 없으면 에러가 발생한다.

 

3. 스프링 Rest Application은 Jackson data bind가 dependency에 있는 경우 자동으로 객체를 변환 해준다.

728x90
댓글