본문 바로가기
Java

Java - ObjectMapper의 JsonNode, ObjectNode, ArrayNode

by sinabeuro 2021. 9. 7.
728x90

JsonNode 라이브러리

JsonNode 라이브러리는 전송받은 Json 데이터를 변경하거나 Json 데이터를 만들 때 유용하게 사용할 수 있는 라이브러리입니다.

Json 트리에 직접적으로 접근해서 Json 데이터를 수정하거나 추가할 수 있습니다. 

DTO 객체의 set()을 이용해서 값을 수정할 수 있지만, Json 데이터로 변경해서 ObjectNode를 통해 각각의 제이슨 노드를 통해서도 값을 수정할 수 있습니다.

 

JsonNode 라이브러리를 사용하기 위해서는 다음과 같은 의존성을 추가합니다. (gradle 기준)

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.1'

 

 

@SpringBootApplication
public class ObjectMapperApplication {

    public static void main(String[] args) throws JsonProcessingException {
        SpringApplication.run(ObjectMapperApplication.class, args);

        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> carList = Arrays.asList(car1, car2);
        user.setCars(carList);

        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);
    }

}

일단 예제에 필요한 Json 데이터를 만들어줍니다.

String json으로 반환된 데이터는 다음과 같습니다.

{"name":"홍길동","age":10,"cars":[{"name":"K5","car_number":"11가 1111","TYPE":"sedan"},{"name":"Q5","car_number":"22가 2222","TYPE":"SUV"}]}

 

 

JsonNode

@SpringBootApplication
public class ObjectMapperApplication {

	public static void main(String[] args) throws JsonProcessingException {
    		SpringApplication.run(ObjectMapperApplication.class, args);
        
        	...
        	// 객체를 json 형식으로 만듭니다.
        	String json = objectMapper.writeValueAsString(user);
        
 		JsonNode jsonNode = objectMapper.readTree(json);
        	// 일반 문자나 숫자를 파싱하는 방법. as 메소드로 형변환을 해야한다.
        	String _name = jsonNode.get("name").asText();
        	int _age = jsonNode.get("age").asInt();
        	System.out.println("_name = " + _name);
        	System.out.println("_age = " + _age);
	}
}

 

objectMapper.readTree() 메소드를 통해서 Json 데이터를 읽어서 JsonNode 인스턴스에 저장할 수 있습니다.

JsonNode를 이용해서 값을 읽어 들일 수 있습니다.

JsonNode에 get() 메소드나 path() 메소드를 이용해 key값을 이용해서 value값을 가져올 수 있습니다.

가져온 값들을 asText(), asInt() 메소드로 String과 int 타입으로 저장할 수 있습니다. 

JsonNode은 Json 데이터를 수정할 수 없으며, 읽어 들일 때만 사용합니다.

Json 데이터를 수정하기 위해서는 ArrayNode나 ObjectNode를 사용합니다.

또한 JsonNode는 배열형식은 읽어들일 수 없습니다. 

배열을 읽기위해서는 ArrayNode를 사용합니다.

 

 

ArrayNode

 

createArrayNode() 매소드로 빈 ArrayNode를 생성할 수 있습니다.

ObjectMapper objectMapper = new ObjectMapper();
ArrayNode arrayNode = objectMapper.createArrayNode();

 

@SpringBootApplication
public class ObjectMapperApplication {

	public static void main(String[] args) throws JsonProcessingException {
		SpringApplication.run(ObjectMapperApplication.class, args);
        
        	...
            	ObjectMapper objectMapper = new ObjectMapper();
            
            	// 객체를 json 형식으로 만듭니다.
        	String json = objectMapper.writeValueAsString(user);
            
		// 배열은 파싱하는 방법
        	JsonNode cars = jsonNode.get("cars");
        	ArrayNode arrayNode = (ArrayNode) cars;
		System.out.println(arrayNode);
            
        	// 원하는 클래스로 매핑하는 메소드
        	List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {});
        	System.out.println(_cars);
	}
}

System.out.println(arrayNode)의 출력값은 다음과 같습니다.

[{"name":"K5","car_number":"11가 1111","TYPE":"sedan"},{"name":"Q5","car_number":"22가 2222","TYPE":"SUV"}]

 

System.out.println(_cars)의 출력 값은 다음과 같습니다.

[Car{name='K5', carNumber='11가 1111', type='sedan'}, Car{name='Q5', carNumber='22가 2222', type='SUV'}]

objectMapper.convertValue() 메소드를 통해서 ArrayNode 객체를 다시 객체로 변경할 수 있습니다.

 

 

ObjectNode

 

createObjectNode() 매소드로 빈 ObjectNode를 생성할 수 있습니다.

ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode();

 

@SpringBootApplication
public class ObjectMapperApplication {

	public static void main(String[] args) throws JsonProcessingException {
		SpringApplication.run(ObjectMapperApplication.class, args);
        
        	...
        	ObjectMapper objectMapper = new ObjectMapper();
        
        	String json = objectMapper.writeValueAsString(user);
        	JsonNode jsonNode = objectMapper.readTree(json);
        
		ObjectNode objectNode = (ObjectNode) jsonNode;
		objectNode.put("name", "steve");
		objectNode.put("age", 20);
		System.out.println(objectNode.toPrettyString());
	}
}

ObjectNode는 JsonNode와 마찬가지로 path()나 get()을 이용해  key 값을 가져올 수 있습니다.
JsonNode에서는 지원하지 않는 put()을 통해 값을 추가/변경이 가능합니다. 

JsonNode와 ObjectNode의 가장 큰 차이점은 Json 객체는 수정할 수 있는지의 여부입니다.

 

 

System.out.println(objectNode.toPrettyString())의 결과값은 다음과 같습니다.

toPrettyString 메소드를 사용해서 Json 데이터를 정리해서 출력가능합니다.

 

참고로 Pretty 폼으로 Json을 변경하는 사이트가 있습니다.

json validator를 검색해서 아무 사이트나 이용하시면 Json을 Pretty 폼으로 쉽게 변경할 수 있습니다.

https://jsonformatter.curiousconcept.com/

 

 

https://yeonyeon.tistory.com/136?category=925909

 

[Jackson] JsonNode, ObjectNode, ArrayNode 차이

🐱‍🐉 개요 이번에 개발하면서 JsonNode, ObjectNode, ArrayNode을 정말 많이 썼는데 정리용으로 글을 작성한다. 먼저 Json에 대해 잘 모르면 아래 글부터 읽어보길 바란다. https://yeonyeon.tistory.com/48?cat..

yeonyeon.tistory.com

 

728x90

'Java' 카테고리의 다른 글

Java - 객체 지향 설계 원칙 SOLID  (0) 2022.04.09
Java - JUnit과 Mock  (0) 2021.09.27
java - RequestHeader  (0) 2021.08.31
java - ObjectMapper  (0) 2021.08.29
java - PUT API  (0) 2021.08.26

댓글