ObjectMapper
Java 객체와 JSON 간 직렬화, 역직렬화를 수행하는 Jackson 라이브러리의 클래스
Java 객체 ===(serialization)===> JSON
JSON ===(deserialization)===> Java 객체
디펜던시에 추가할 수 있는 목록과 버전 확인
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/
ObjectMapper는 생성 비용이 높다고 알려져 있어서 bean으로 등록해서 재사용하거나 static으로 만들어 사용하는 것이 좋다.
스프링에서는 해당 라이브러리 없이도 @RestController 어노테이션 사용 시 응답값으로 JSON 형식을 사용한다.
요청 시에도 @RequestBody를 사용한다면 JSON 형식을 입력으로 받을 수도 있다.
'공부 기록 > Java' 카테고리의 다른 글
[Java] 큐(Queue) (0) | 2023.05.12 |
---|---|
[Java] 문자열(String), 숫자(int, double, float, long, short) 형변환 (0) | 2023.05.04 |
[Java] POJO (0) | 2023.05.04 |
[Java] LinkedList - List, Deque의 구현 (0) | 2023.05.04 |
[Java] throw Exception 테스트하기 (0) | 2023.04.30 |