JsonNode는 Jackson 라이브러리가 제공하는 JSON 트리 모델(tree model)입니다. 이 모델을 사용하면 JSON 문자열을 JsonNode 인스턴스로 읽어 들이거나, 반대로 JsonNode 객체를 다시 JSON 형태로 출력할 수 있습니다.
JSON 데이터를 JsonNode로 파싱하려면 먼저 ObjectMapper 인스턴스를 생성한 뒤 readValue() 메서드를 호출하면 됩니다. 그리고 JsonNode 클래스가 제공하는 다양한 메서드를 활용해 원하는 데이터를 손쉽게 추출할 수 있습니다.
주요 메서드 정리
- get(String fieldName): 필드 이름으로 JSON 필드나 중첩 객체에 접근합니다. 배열의 경우 인덱스 번호를 전달하여 특정 요소에 접근합니다.
- asText(): 노드의 값을 문자열(String) 형태로 반환합니다.
- asInt(): 노드의 값을 Java int 타입으로 변환하여 반환합니다.
아래 예제에서는 JsonNode를 사용해 JSON 필드, 배열 요소, 그리고 중첩 객체의 값에 각각 접근하는 방법을 보여줍니다.
예제 코드
import com.fasterxml.jackson.databind.*;
import java.io.*;
public class ParseJSONNodeTest {
public static void main(String args[]) {
String jsonStr = "{ \"name\" : \"Raja\", \"age\" : 30," +
" \"technologies\" : [\"Java\", \"Scala\", \"Python\"]," +
" \"nestedObject\" : { \"field\" : \"value\" } }";
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode node = objectMapper.readValue(jsonStr, JsonNode.class);
// 단순 필드 접근
JsonNode nameNode = node.get("name");
String name = nameNode.asText();
System.out.println(name);
// 숫자 필드 접근
JsonNode ageNode = node.get("age");
int age = ageNode.asInt();
System.out.println(age);
// 배열 요소 접근 (인덱스 사용)
JsonNode array = node.get("technologies");
JsonNode jsonNode = array.get(1);
String techStr = jsonNode.asText();
System.out.println(techStr);
// 중첩 객체 내부 필드 접근
JsonNode child = node.get("nestedObject");
JsonNode childField = child.get("field");
String field = childField.asText();
System.out.println(field);
} catch (IOException e) {
e.printStackTrace();
}
}
}
실행 결과
Raja 30 Scala value
정리
이처럼 JsonNode를 활용하면 별도의 DTO 클래스 없이도 JSON 구조를 유연하게 탐색할 수 있습니다. 단순 필드는 get()과 asText()/asInt() 조합으로 처리하고, 배열은 인덱스 기반 get(int index), 중첩 객체는 하위 노드에 다시 get()을 호출하는 방식으로 순차적으로 접근하면 됩니다.