Object Mapper
- Object Mapper는 Text 형태의 JSON을 Object 변경해주고, Object를 Text JSON으로 변경해준다.
- Controller의 request의 입력으로 JSON이 들어오면 이를 Object로 변경하고 Object를 return하면 Object를 JSON으로 변경해 반환한다.
src/main에 code작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.example.objectmapper;
@Getter
@Setter
public class User {
private String name;
private int age;
public User(){}
public User(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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("------------");
var objectMapper = new ObjectMapper();
var user = new User("kms", 28);
var text = objectMapper.writeValueAsString(user);
System.out.println(text);
var objectUser = objectMapper.readValue(text, User.class);
System.out.println(objectUser);
}
}
- test에서 object mapper와 object를 생성해 JSON으로 변환 해보고, 이를 다시 object로 변환해 보았다.
- 만약 User class에 getter가 없다면 위의 test는 첫 번째 변환에서 error가 발생하는데 이는 object mapper가 get method를 사용해 object를 JSON으로 변경하기 때문이다.
- 마찬가지로 setter가 없다면 error가 발생하고 default 생성자가 없을 경우에도 error가 발생한다. 이는 JSON을 object로 변경할 때 Default생성자로 객체를 생성해 setter를 사용해 변경하기 때문이다.
- 많이 실수하는 부분이 Class에 get을 앞에 붙인 메서드를 생성할 때가 있는데 만약 해당 Class가 Object Mapper에서 활용이 된다면 serialize, deserialize할 때 error가 발생한다.
Json 데이터 조작
- Dependency추가
1
2
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.1'
JSON node에 접근
- sample json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"name":"김민수",
"age":28,
"cars":[
{
"name":"K5",
"car_number":"11가 1111",
"TYPE":"sedan"
},
{
"name":"Q5",
"car_number":"22나 2222",
"TYPE":"SUV"
}
]
}
- dto.Car
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package dto;
import com.fasterxml.jackson.annotation.JsonProperty;
@Getter
@Setter
public class Car {
private String name;
@JsonProperty("car_number")
private String carNumber;
@JsonProperty("TYPE")
private String type;
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", carNumber='" + carNumber + '\'' +
", type='" + type + '\'' +
'}';
}
}
- dto.User
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package dto;
import java.util.List;
@Setter
@Getter
public class User {
private String name;
private int age;
private List<Car> cars;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", cars=" + cars +
'}';
}
}
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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 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(28);
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> carList = Arrays.asList(car1, car2);
user.setCars(carList);
System.out.println(user); // ->>> User 객체 생성
//object mapper를 사용해 객체를 JSON으로 변환
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
//objectMapper의 readTree를 사용해 JsonNode에 접근
JsonNode jsonNode = objectMapper.readTree(json);
String _name = jsonNode.get("name").asText();
int _age = jsonNode.get("age").asInt();
System.out.println(_name);
System.out.println(_age);
//cars의 경우 ListType으로 된 내부의 Node로 볼 수 있다.
//Node로 cars부분을 가져온 뒤 ArrayNode로 형 변환
JsonNode cars = jsonNode.get("cars");
ArrayNode arrayNode = (ArrayNode)cars;
//convertValue를 사용해 ArrayNode를 원하는 형식으로 파싱
List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {});
System.out.println(_cars);
}
}
JsonNode 값 수정하기
- JsonNode에서는 값을 수정하는 메서드가 존재하지 않는다.
- 값을 수정하기 위해서는 ObjectNode로 JsonNode를 형 변환 한 뒤 put 혹은 set 메서드를 사용해 값을 수정 할 수 있다.
1
2
3
4
ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.put("name", "xxx");
objectNode.put("age", 999);
System.out.println(objectNode.toPrettyString());