본문 바로가기

공부 기록/Java

[Java] ObjectMapper

ObjectMapper

Java 객체와 JSON 간 직렬화, 역직렬화를 수행하는 Jackson 라이브러리의 클래스

Java 객체 ===(serialization)===> JSON

JSON ===(deserialization)===> Java 객체

  

디펜던시에 추가할 수 있는 목록과 버전 확인

https://mvnrepository.com/

  

Jackson Databind

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


디펜던시 추가

dependencies {
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.2'
}

윈도우 환경에서 인코딩 오류가 발생할 경우

Settings > Editor > File Encodings > Global Encoding, Project Encoding, Default encoding for properties files 옵션을 UTF-8로 변경

Help > Edit Custom VM Options... 아래와 같이 입력

-Dfile.encoding=UTF-8

인텔리제이 restart

(맥은 기본이 UTF-8이라서 신경쓰지 않아도 된다.)


Java 객체 -> JSON

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
    
        Person person = new Person();
        person.setName("Yuri");
        person.setAge(10);
        
        Cat cat1 = new Cat();
        cat1.setName("May");
        cat1.setAge(9);
        
        Cat cat2 = new Cat();
        cat2.setName("Mary");
        cat2.setAge(9);
        
        person.setFriends(Arrays.asList(cat1, cat2));
    
        ObjectMapper objectMapper = new ObjectMapper();
    
        String json = objectMapper.writeValueAsString(person);
        // {"name":"Yuri", "AGE":10, "friends":[{"name":"May", "age":9}, {"name":"Mary", "age":9}]}
    
    }
}

@Getter
@Setter
class Person {
    private String name;
    
    @JsonProperty("AGE")
    private int age;
    
    private List<Cat> friends;
}

@Getter
@Setter
class Cat {
    private String name;
    private int age;
}

@JsonProperty() : JSON으로 변환 시 이름 지정

  


JSON -> Java 객체

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
    
        ...
    
        String json = objectMapper.writeValueAsString(person);
        // {"name":"Yuri", "AGE":10, "friends":[{"name":"May", "age":9}, {"name":"Mary", "age":9}]}
        
        JsonNode jsonNode = objectMapper.readTree(json);
        String _name = jsonNode.get("name").asText();
        int _age = jsonNode.get("age").asInt();
    
        JsonNode friends = jsonNode.get("friends");
        ArrayNode arrayNode = (ArrayNode) friends;
        
        List<Cat> _friends = objectMapper.convertValue(arrayNode, new TypeReference<List<Cat>>() {});
    
    }
}

...

get()을 사용하려면 해당 JSON의 표준 스펙을 알아야 한다.

convertValue()를 사용하면 원하는 타입으로 형변환할 수 있다.

 


값 변환하기

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
    
        ...
    
        String json = objectMapper.writeValueAsString(person);
        // {"name":"Yuri", "AGE":10, "friends":[{"name":"May", "age":9}, {"name":"Mary", "age":9}]}
        
        JsonNode jsonNode = objectMapper.readTree(json);
        
        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.put("name", "Hello");
        // {"name":"Hello", "AGE":10, "friends":[{"name":"May", "age":9}, {"name":"Mary", "age":9}]}
        
    }
}

...

JSON Formatter & Validator

https://jsonformatter.curiousconcept.com/

 

JSON Formatter & Validator

Format and validate JSON data so that it can easily be read by human beings.

jsonformatter.curiousconcept.com


ObjectMapper는 생성 비용이 높다고 알려져 있어서 bean으로 등록해서 재사용하거나 static으로 만들어 사용하는 것이 좋다.
스프링에서는 해당 라이브러리 없이도 @RestController 어노테이션 사용 시 응답값으로 JSON 형식을 사용한다.
요청 시에도 @RequestBody를 사용한다면 JSON 형식을 입력으로 받을 수도 있다.