본문 바로가기
Develop/Java

[Jackson] JsonNode, ObjectNode, ArrayNode 차이

by 연로그 2021. 8. 24.
반응형

🐱‍🐉 개요

이번에 개발하면서 JsonNode, ObjectNode, ArrayNode을 정말 많이 썼는데 정리용으로 글을 작성한다.

먼저 Json에 대해 잘 모르면 아래 글부터 읽어보길 바란다.

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

 

[Json] Json의 개념과 형식

개요 JsonNode와 ObjectNode의 차이점을 찾다가 아예 json에 대해 정리하게 되었다. 목차는 다음과 같다. Json의 개념 Java에서 Json 사용하기 - Jackson JsonObject와 JsonArray JsonNode와 ObjectNode Json 관련..

yeonyeon.tistory.com

 

🐱‍👤 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>

 

공식 페이지: https://github.com/FasterXML/jackson

 

GitHub - FasterXML/jackson: Main Portal page for the Jackson project

Main Portal page for the Jackson project. Contribute to FasterXML/jackson development by creating an account on GitHub.

github.com

 

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

 

[Java] 얕은 복사와 깊은 복사 (+Clone)

코딩테스트를 보면서 Queue를 여러 메소드에서 사용하다가 요소가 여러개 삭제되는 경우가 있었다. 파라미터로 보낸 Queue에서 요소를 삭제하면 원본 Queue에도 영향을 미치는 문제였으며, String 같

yeonyeon.tistory.com

 


참고

반응형

'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