🐱🐉 개요
이번에 개발하면서 JsonNode, ObjectNode, ArrayNode을 정말 많이 썼는데 정리용으로 글을 작성한다.
먼저 Json에 대해 잘 모르면 아래 글부터 읽어보길 바란다.
https://yeonyeon.tistory.com/48?category=925909
🐱👤 JsonNode, ObjectNode, ArrayNode
JsonNode, ObjectNode, ArrayNode는 Jackson 라이브러리에서 제공하는 객체다.
🔻 Jackson이란?
- Json을 Java Object로 변환하거나 Java Object를 Json으로 편하게 변환시킬 수 있게 해주는 Java 라이브러리
- gradle이나 maven에서도 간단하게 추가할 수 있다.
Gradle
compile "com.fasterxml.jackson.core:jackson-databind:2.9.4"
Maven
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
JsonNode, ObjectNode, ArrayNode 셋의 차이점을 간단히 정리해보자면 아래와 같다.
값 변경 가능 여부 | 형태 | |
JsonNode | 불변 | {key:value} |
ObjectNode | 가변 | {key:value} |
ArrayNode | 가변 | [value1, value2, value3] |
먼저 각 노드를 생성하는 방법부터 시작해보겠다.
기본적으로 Jackson 라이브러리가 프로젝트 내에 존재한다는 가정하에 테스트를 진행한다.
ObjectMapper om = new ObjectMapper();
ObjectNode objectNode = om.createObjectNode();
ArrayNode arrayNode = om.createArrayNode();
- ObjectMapper: JSON을 읽기, 쓰기, 변환 기능을 제공하는 객체
- createObjectNode(): 빈 ObjectNode 생성
- createArrayNode(): 빈 ArrayNode 생성
- JsonNode는 값을 추가할 수 없는 불변의 객체이므로 빈 객체를 생성할 필요 X (프론트에서 파라미터로 넘겨주는 JSON을 담아내는데 사용하고는 한다.)
🐾 JsonNode
path()나 get()을 이용해 key값을 이용해 value 값을 가져올 수 있다.
참고로 get은 해당 값이 존재하지 않을 경우 null을 가져오므로 보통은 path를 자주 사용한다.
path()의 경우 null 대신 MissingNode를 반환한다.
// json = {"name":"yeonLog", "age":25}
public void JsonTest (JsonNode json) {
JsonNode temp = json;
String name = temp.path("name").asText();
System.out.println(name);
}
- path(), get()을 통해 key 값을 이용한 value 가져오기
- asText(), asInt() 등의 메소드를 통해 형변환 가능
🐾 ObjectNode
마찬가지로 path()나 get()을 이용해 key 값을 가져올 수 있다.
JsonNode에서는 지원하지 않는 put()을 통해 값을 추가/변경이 가능하다.
// json = {"name":"yeonLog", "age":25}
public void JsonTest (JsonNode json) {
ObjectNode temp = (ObjectNode) json;
temp.put("name","yeon");
String name = temp.path("name").asText();
System.out.println(name);
}
- put()을 이용한 값 추가
🔻 JsonNode를 ObjectNode로 형변환하기
JsonNode와 ObjectNode를 처음 접한 사람이라면 위 코드에서 의아한 부분이 있을 것이다.
JsonNode인 json 변수가 어떻게 (ObjectNode) 만으로 형변환이 가능하지?
결론부터 말하자면, 두 객체는 같은 interface를 implement 하기 때문에 자유로운 형변환이 가능하다.
자세한 사항은 글 하단의 참고 링크를 참고 바란다.
🐾 ArrayNode
// json = {"name":"yeonLog", "age":25}
public void JsonTest (JsonNode json) {
ArrayNode arrayNode = om.createArrayNode();
arrayNode.add("Java");
arrayNode.add("Spring");
ObjectNode temp = (ObjectNode) json;
temp.put("study", arrayNode);
System.out.println(temp.toString());
arrayNode.remove("Spring");
System.out.println(temp.toString());
}
- add()를 이용해 값 추가
- remove()를 이용한 값 제거
🔻 remove 전후로 출력 결과가 다른 이유는?
위 코드를 살펴보면 temp에 arrayNode를 추가한건 remove 전이다.
결과를 조회해보면 remove한 후에 temp에 새로 put 하지 않았는데도 Spring이 제거된 상태로 조회된다.
이는 ObjectNode가 객체이기 때문이다.
이와 관련한 내용은 얕은 복사, 깊은 복사를 공부하길 바란다.
https://yeonyeon.tistory.com/122
참고
- JsonNode: https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/JsonNode.html
- ObjectNode: https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/node/ObjectNode.html
- ArrayNode: https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/node/ArrayNode.html
'Develop > Java' 카테고리의 다른 글
Comparator와 Comparable 정리 (0) | 2021.10.21 |
---|---|
[Java] BufferedReader, BufferedWriter (0) | 2021.10.04 |
[Java] 얕은 복사와 깊은 복사 (+Clone) (0) | 2021.06.22 |
[Java] static과 synchronized (0) | 2021.05.26 |
[Java] Collections와 Map (1) | 2021.05.21 |