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

Java flexjson의 @JSON 어노테이션으로 직렬화 제어하기

개요

@JSON 어노테이션JSONSerializer 클래스에서 사용되며, 직렬화(serialize) 과정 중에 특정 필드를 결과에 포함하거나 제외할 수 있게 해줍니다. JSONSerializer 클래스의 serialize() 메서드를 호출하면 대상 객체 인스턴스에 대한 얕은(shallow) 직렬화가 수행되는데, 이때 getter 메서드에 붙은 @JSON 어노테이션 설정이 반영됩니다.

문법

@Retention(value=RUNTIME)
@Target(value={FIELD,TYPE,METHOD})
public @interface JSON

@JSON 어노테이션은 런타임(RUNTIME)까지 유지되며, 필드(FIELD), 타입(TYPE), 메서드(METHOD)에 적용할 수 있습니다. 가장 많이 쓰이는 속성인 include는 boolean 값을 가지며, 기본값은 true입니다. false로 설정하면 해당 필드가 JSON 출력에서 제외됩니다.

예제 코드

아래 예제는 Employee 클래스의 lastName과 address 필드에 @JSON(include=false)를 적용하여, 직렬화 결과에서 이 두 필드를 제외하는 방법을 보여줍니다.

import flexjson.JSONSerializer;
import flexjson.JSON;

public class JSONAnnotationTest {
    public static void main(String[] args) {
        JSONSerializer serializer = new JSONSerializer().prettyPrint(true);
        Employee emp = new Employee("Raja", "Ramesh", 30, "Hyderabad");
        String jsonStr = serializer.serialize(emp);
        System.out.println(jsonStr);
    }
}

// Employee 클래스
class Employee {
    private String firstName, lastName, address;
    private int age;

    public Employee(String firstName, String lastName, int age, String address) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.address = address;
    }

    public String getFirstName() {
        return firstName;
    }

    // lastName 필드는 직렬화에서 제외
    @JSON(include=false)
    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    // address 필드는 직렬화에서 제외
    @JSON(include=false)
    public String getAddress() {
        return address;
    }
}

실행 결과

{
  "age": 30,
  "class": "Employee",
  "firstName": "Raja"
}

정리

위 실행 결과를 보면 firstName과 age만 JSON으로 변환되고, @JSON(include=false)이 적용된 lastName과 address는 출력에서 제외된 것을 확인할 수 있습니다. 또한 flexjson은 기본적으로 클래스 정보를 나타내는 "class" 키를 함께 출력하는데, 이를 숨기려면 new JSONSerializer().exclude("class")처럼 exclude() 메서드를 함께 사용하면 됩니다.