본문 바로가기
Spring

Object Mapper

by step 1 2021. 6. 12.
반응형

의도적으로 사용자가 Object를 Json형태로 또는 Json을 Object로 변환해야할 때 사용

Object를 Json으로 변환할때는 DTO에 get Method를 사용하고

(get이라는 이름에 다른 함수는 작성하지 말아야한다)

 

Json을 Object로 변환할 때는 default 생성자를 사용한다.

 

Test 코드 프로젝트 구조

User Object클래스 생성

package com.example.objectmapper;

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    private String name;
    private int age;

    @JsonProperty("phone_number")
    private String phoneNumber;

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public User(){
        this.name = null;
        this.age = 0;
        this.phoneNumber = null;
    }
    public User(String name, int age, String phoneNumber ){
        this.name = name;
        this.age = age;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // get이라는 이름을 붙여서 만들면 object를 text로 변환할 때 에러발생
   /* public int getdefault() {
        return age = 9;
    }*/

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                '}';
    }
}

 

Test 코드

package com.example.objectmapper;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ObjectMapperApplicationTests {

    @Test
    void contextLoads() throws JsonProcessingException {
        System.out.println("-------------");

        // Text JSON -> object
        // object -> Text Json

        // controller req Json(Text) -> object
        // response object -> Json(Text)

        var objectMapper = new ObjectMapper();

        // object -> text
        // object mapper가 get method를 활용한다.
        // 일반적인 get Method말고 함수를 따로 만들때 get이라는 이름을 붙여서 만들면 에러가 발생할수 있다
        var user = new User("steve", 10, "010-222-3333");
        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);

        // text -> object
        // object mapper는 default 생성자를 필요로 한다.
        var objectUser = objectMapper.readValue(text, User.class);
        System.out.println(objectUser);
    }

}

 

 

자바에서 Object Mapper 사용

dependency 등록 (Jackson Databind)

https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind

build.gradle 파일에 추가

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.3'

파일실행 에러 참고 (원인 Encoding 에러)

처리 방법

File - > Settings -> 검색 (encoding) -> 파일 인코딩 -> UTF-8 설정

Help -> Find Action -> edit custom VM Option (사용자 지정 VM 옵션 편집)

-> 파일 하단에 추가 (-Dfile.encoding=UTF-8)

인텔리제이 모두 재시작

 

위 방법이 모두 안될 경우

https://knoow.tistory.com/195

 

[IntelliJ IDEA] 한글 깨짐

Java GUI로 간단한 출력 프로그램을 작성하는 중에 println() 출력함수를 써서 문자를 찍었는데 한글이 깨졌다. 간단한 Encoding 문제일 줄 알았는데, 이렇게 오래 시간을 끌 줄이야... 참고로, 제가 해

knoow.tistory.com

build.gradle 파일에 추가

compileJava.options.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

 

예제

Dto 생성

package dto;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Car {

    private String name;

    @JsonProperty("car_number")
    private String carNumber;

    @JsonProperty("TYPE")
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}
package dto;

import java.util.List;

public class User {

    private String name;
    private int age;
    private List<Car> cars;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cars=" + cars +
                '}';
    }
}

main 생성

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import dto.Car;
import dto.User;

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        System.out.println("main");

//		데이터 생성
        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setName("홍길동");
        user.setAge(10);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11가 1111");
        car1.setType("sedan");

        Car car2 = new Car();
        car2.setName("Q5");
        car2.setCarNumber("22가 2222");
        car2.setType("SUV");

//      List에 Car 클래스 값을 넣어준다.
        List<Car> list = Arrays.asList(car1,car2);
        user.setCars(list);

        System.out.println(user);

        System.out.println("======================================");
//      Json으로 변환
        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);

        System.out.println("=====================");

//      Json의 데이터를 key값으로 가져오기
        JsonNode jsonNode = objectMapper.readTree(json);
        String _name = jsonNode.get("name").asText();
        int _age = jsonNode.get("age").asInt();
        System.out.println("name: " + _name + " age: " + _age);

        System.out.println("============================");
//      JSon에 배열 데이터 가져오기
        JsonNode cars = jsonNode.get("cars");
        ArrayNode arrayNode = (ArrayNode) cars;

        List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>(){});
        System.out.println(_cars);
        System.out.println(_cars.get(1).getCarNumber());
        System.out.println("============================");

//      json 데이터 변경하기
        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.put("name", "강감찬");
        objectNode.put("age", 30);
//      Json 형태로 출력
        System.out.println(objectNode.toPrettyString());
        System.out.println("================");
    }
}

반응형

'Spring' 카테고리의 다른 글

IoC / DI  (0) 2021.06.12
Spring 핵심  (0) 2021.06.12
Response 내려주기  (0) 2021.06.12
Delete API  (0) 2021.06.12
PUT API  (0) 2021.06.12