본문 바로가기

웹 프레임워크/Spring

Spring Controller에서 list형태가 포함되어 있는 json 포맷 받기, 응답

728x90

입력 JSON

{
  "products" : [
      {
          "name" : "computer",
          "price" : 20000
      },
      {
          "name" : "book",
          "price" : 9900
      }
  ],
  "name" : "ychoi",
  "age": 23,
}

 

다음과 같은 list가 포함되어있는 json포맷이 데이터를 받아야할 일이 생겼습니다.

jackson을 사용해서 객체로 받아보겠습니다.

 

pom.xml

    //생략
    <properties>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>5.2.2.RELEASE</spring.version>
        <jackson2.version>2.10.2</jackson2.version>        
    </properties>
    
    //생략
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson2.version}</version>
        </dependency>
    //생략

pom.xml 파일입니다.

Spring 버전은 5.2.2 이며, jackson 라이브러리 버전은 2.10.2 입니다..

jackson-databind을 사용하면 JSON콘텐츠를 Java객체로 손쉽게 맵핑할 수 있습니다.

 

javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind/2.10.2/index.html

 

VO(Value Object)

package kr.or.connect.reservation.vo;

import java.util.List;

public class UserVo {
  private String name;
  private int age;
  private List<ProductVo> products;

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }

  public List<Product> getProducts() {
    return products;
  }

  @Override
  public String toString() {
    return "UserVo [name=" + name + ", age=" + age + ", products=" + products + "]";
  }
}

UserVo 객체를 만들어 줍니다. 기존에 만들어져 있는 DTO나 Entitiy객체를 사용해도 됩니다. 

nameage, 그리고 리스트 형태의 ProdutVo 객체가 있습니다.

 

 

package kr.or.connect.reservation.vo;

public class ProductVo {
  private String name;
  private int price;

  public String getName() {
    return name;
  }

  public int getPrice() {
    return price;
  }

  @Override
  public String toString() {
    return "Product [name=" + name + ", price=" + price + "]";
  }
}

 

ProductVo객체를 만들어 줍니다. Name과 Price를 가지고 있습니다.

 

 

Controller

package kr.or.connect.reservation.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import kr.or.connect.reservation.vo.ProductVo;
import kr.or.connect.reservation.vo.UserVo;

@RestController
@RequestMapping("/api/test")
public class MainController {

  @PostMapping
  public UserVo testApilist(@RequestBody UserVo uservo) {
    System.out.println(uservo.toString());

    for (ProductVo product : uservo.getProducts()) {
      System.out.println(product.toString());
    }
    
    return uservo;
  }
}

 

 

 

 

테스트

Controller에서 UserVo객체를 반환했을때, List형태로 응답하는 것 또한 볼 수 있습니다.

println으로 UserVo객체ProductVo객체를 살펴보면 jackson에 의해 객체로 맵핑되어 있는 것을 볼 수 있습니다.

728x90