Java에서 객체를 JSON으로 변환할 때 특정 속성을 제외하고 싶다면 JsonConfig 클래스를 활용할 수 있습니다. JsonConfig는 직렬화(serialization) 과정을 세밀하게 설정할 수 있도록 도와주는 클래스로, setJsonPropertyFilter() 메서드를 사용하면 JSON으로 직렬화되는 시점에 원하는 속성만 골라내는 필터를 적용할 수 있습니다.
필터를 적용하려면 PropertyFilter 인터페이스의 apply() 메서드를 재정의(override)하여 커스텀 필터 클래스를 구현해야 합니다. 이 메서드는 해당 속성을 필터링(제외)할 경우 true를 반환하고, 포함할 경우 false를 반환합니다.
문법(Syntax)
public void setJsonPropertyFilter(PropertyFilter jsonPropertyFilter)
예제(Example)
아래 예제에서는 Student 빈을 JSON 객체로 변환하면서, 숫자(Number)와 문자열(String) 타입이 아닌 속성을 자동으로 제외하는 커스텀 필터를 적용합니다.
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.PropertyFilter;
public class ConvertBeanToJsonExcludeFilterTest {
public static void main(String[] args) {
Student student = new Student("Sai", "Chaitanya", 20, "Hyderabad");
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setJsonPropertyFilter(new CustomPropertyFilter());
JSONObject jsonObj = JSONObject.fromObject(student, jsonConfig);
System.out.println(jsonObj.toString(3)); // 보기 좋게 출력(pretty print)
}
public static class Student {
private String firstName, lastName, address;
public int age;
public Student(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;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}
}
}
// 커스텀 PropertyFilter 클래스
class CustomPropertyFilter implements PropertyFilter {
@Override
public boolean apply(Object source, String name, Object value) {
if(Number.class.isAssignableFrom(value.getClass()) || String.class.isAssignableFrom(value.getClass())) {
return false; // Number 또는 String 타입이면 포함
}
return true; // 그 외 타입은 필터링(제외)
}
}실행 결과(Output)
{
"firstName": "Sai",
"lastName": "Chaitanya",
"address": "Hyderabad",
"age": 20
}위 실행 결과에서 확인할 수 있듯이, Student 객체의 모든 속성이 Number 또는 String 타입에 해당하기 때문에 필터링되지 않고 모두 JSON에 포함되었습니다. 만약 특정 타입이나 특정 이름의 속성을 제외하고 싶다면 apply() 메서드 내부의 조건을 수정하여 원하는 대로 필터 로직을 조정하면 됩니다.