Home Object Mapper
Post
Cancel

Object Mapper

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);
    }

}

ObejctMapper

  • 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());

Jackson

This post is licensed under CC BY 4.0 by the author.