반응형
의도적으로 사용자가 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)
인텔리제이 모두 재시작
위 방법이 모두 안될 경우
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 |