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

Java Jackson API의 @JsonRawValue 어노테이션 완벽 가이드


@JsonRawValue 어노테이션이란?

@JsonRawValue 어노테이션은 메서드와 필드 모두에 적용할 수 있으며, 필드나 프로퍼티를 선언된 형태 그대로 직렬화하는 데 사용됩니다.

예를 들어, Java 클래스에 String 타입의 필드가 있으면 일반적으로 직렬화 시 JSON 값이 따옴표(" ")로 감싸져 출력됩니다. 하지만 해당 필드에 @JsonRawValue 어노테이션을 붙이면 Jackson 라이브러리는 따옴표를 생략하고 값을 있는 그대로 JSON에 포함시킵니다.

이 어노테이션은 이미 JSON 형식으로 저장된 문자열 데이터를 중첩된 JSON 구조로 자연스럽게 출력해야 할 때 특히 유용합니다. 별도의 역직렬화 및 재직렬화 과정 없이 성능상 이점도 얻을 수 있습니다.

문법

@Target(value={ANNOTATION_TYPE,METHOD,FIELD})
@Retention(value=RUNTIME)
public @interface JsonRawValue

위 정의에서 볼 수 있듯이, @JsonRawValue는 애노테이션 타입, 메서드, 필드에 적용 가능하며 런타임까지 유지됩니다.

예제

아래 예제에서 empAddress 필드는 JSON 문자열입니다. 이 JSON 문자열은 Employee 객체의 최종 JSON 문자열에 그대로 포함되어 직렬화됩니다.

import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;

public class JsonRawValueAnnotationTest {
    public static void main(String args[]) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new Employee());
        System.out.println(jsonString);
    }
}

// Employee 클래스
class Employee {
    public int empId = 115;
    public String empName = "Sai Chaitanya";

    @JsonRawValue
    public String empAddress = "{\"doorNumber\": 1118, \"street\": \"IDPL Colony\", " + "\"city\": \"Hyderabad\"}";
}

출력 결과

{
  "empId" : 115,
  "empName" : "Sai Chaitanya",
  "empAddress" : {"doorNumber": 1118, "street": "IDPL Colony", "city": "Hyderabad"}
}

출력 결과를 보면 empAddress 값이 문자열이 아니라 실제 JSON 객체 형태로 출력된 것을 확인할 수 있습니다. 만약 @JsonRawValue 어노테이션이 없었다면 empAddress 값 전체가 따옴표로 감싸진 하나의 문자열로 출력되었을 것입니다.