Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 JsonNode로 JSON 필드, 배열, 중첩 객체에 접근하는 방법

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()을 호출하는 방식으로 순차적으로 접근하면 됩니다.