본문 바로가기
플랫폼엘 정리or해석

Json 코드 해석

by shulk 2024. 6. 25.

1. 객체를 JSON형식으로 변환 (직렬화)

단계별 설명

  1. TokenBuffer buffer = new TokenBuffer(null);:
    • TokenBuffer는 Jackson에서 제공하는 클래스입니다. JSON 내용을 메모리에 저장할 수 있는 버퍼 역할을 합니다. 이 버퍼는 일종의 중간 저장소로 사용됩니다.
  2. ObjectMapper objectMapper = new ObjectMapper();:
    • Jackson의 핵심 클래스 중 하나인 ObjectMapper를 생성합니다. 이 객체는 Java 객체와 JSON 간의 변환 작업을 수행합니다.
  3. objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);:
    • ObjectMapper의 직렬화 설정을 변경하여 null 값을 가진 속성은 JSON 출력에서 제외하도록 설정합니다. 즉, null인 필드는 JSON 결과에 포함되지 않습니다.
  4. objectMapper.writeValue(buffer, object);:
    • 주어진 객체를 TokenBuffer에 JSON 형식으로 씁니다. 이 단계에서 객체의 JSON 표현이 메모리 내의 버퍼에 저장됩니다.
  5. JsonNode root = objectMapper.readTree(buffer.asParser());:
    • TokenBuffer에서 JSON 데이터를 파싱하여 JsonNode 트리를 만듭니다. JsonNode는 Jackson의 JSON 트리 모델을 표현하는 클래스입니다.
  6. String jsonText = objectMapper.writeValueAsString(root);:
    • JsonNode 트리를 JSON 문자열로 변환합니다. 이 단계에서 JSON 트리 구조가 문자열로 직렬화됩니다.
  7. jsonText = jsonText.replaceAll("null", "\"\"");:
    • JSON 문자열 내의 "null" 값을 빈 문자열 ""로 대체합니다. 이로 인해 JSON 결과에서 null 값이 빈 문자열로 대체됩니다.
  8. return jsonText;:
  • 최종적으로 변환된 JSON 문자열을 반환합니다

 

토큰버퍼를 사용한 이유

 

정리하면

원래 코드에서 TokenBuffer를 사용하는 구체적인 이유는 다음과 같을 수 있습니다:

  • 성능 최적화: 대량의 JSON 데이터를 처리할 때 메모리 버퍼를 사용하여 효율성을 높일 수 있습니다.
  • 복잡한 JSON 변환: JSON 데이터를 트리 구조로 변환한 후, 특정 노드를 수정하거나 추가하는 등의 복잡한 작업을 수행할 수 있습니다.
  • 일관성 유지: 동일한 ObjectMapper 설정을 사용하여 여러 단계의 변환을 거쳐 JSON 데이터를 일관되게 유지할 수 있습니다.

이와 같은 이유로 TokenBuffer를 사용하여 객체를 메모리에 저장한 후, JSON 형식으로 변환하는 단계를 거치는 것입니다.

 

그러나 토큰버퍼 사용 안하고 할 수 있다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JsonUtil {

    private static ObjectMapper objectMapper = new ObjectMapper();

    public static String marshallingJson(Object object) throws IOException {
        // null 값은 직렬화에서 제외
        objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);

        // 객체를 JsonNode 트리로 변환
        ObjectNode root = objectMapper.valueToTree(object);

        // JSON 트리를 JSON 문자열로 변환
        String jsonText = objectMapper.writeValueAsString(root);

        // "null" 값을 빈 문자열로 변환 
        // 이미 null값은 직렬화에서 제외하는 메소드 했으니 없어도 될듯
        //jsonText = jsonText.replaceAll("null", "\"\"");

        return jsonText;
    }
}

 

 

2. JSON을 객체로 변환 (역직렬화)

 <T>는 제네릭 타입 매개변수 선언하는 이 부분은 메소드가 제네릭 타입 T를 사용할 것임을 컴파일러에게 알려주는 역활을 하고 

그 옆에 제네릭 T는 메소드 반환타입을 말하는거다.

objectMapper.readValue(data, valueType)는 JSON 문자열을 valueType 클래스의 객체로 변환하는거다.

 

그리고 예를들어 Person객체로 반환한다했을때 기본생성자는 필수인듯하고,setter방식으로 객체필드에 값을 매칭하거나

생성자 방식으로는 이렇게도 할 수 있다.

public class Person {
    private String name;
    private int age;

    // 필드를 받는 생성자에 @JsonCreator와 @JsonProperty 애노테이션 사용
    @JsonCreator
    public Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {
        this.name = name;
        this.age = age;
    }
}