@JsonFilter एनोटेशन का उपयोग जावा ऑब्जेक्ट्स को सीरियलाइज करने के लिए कस्टम फिल्टर परिभाषित करने के लिए किया जाता है। हमें फिल्टर को परिभाषित करने और वास्तविक फिल्टर इंस्टेंस प्राप्त करने के लिए FilterProvider क्लास का उपयोग करने की आवश्यकता होती है। अब फिल्टर को FilterProvider को ObjectMapper क्लास में असाइन करके कॉन्फिगर किया जाता है।
सिंटैक्स
@Target(value={ANNOTATION_TYPE,TYPE,METHOD,FIELD,PARAMETER})
@Retention(value=RUNTIME)
public @interface JsonFilter
उदाहरण
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
public class JsonFilterAnnotationTest {
public static void main(String args[]) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
FilterProvider filterProvider = new SimpleFilterProvider()
.addFilter("customFilter",
SimpleBeanPropertyFilter.filterOutAllExcept("empName"));
String jsonString = mapper.writer(filterProvider)
.writeValueAsString(new FilterBean());
System.out.println(jsonString);
}
}
@JsonFilter("customFilter")
class FilterBean {
public int empId = 110;
public String empName = "Raja Ramesh";
public String gender = "male";
}
आउटपुट
{"empName":"Raja Ramesh"}
फिल्टर के प्रकार
| फिल्टर | विवरण | उदाहरण |
|---|---|---|
| filterOutAllExcept() | निर्दिष्ट फील्ड्स के अलावा सभी को एक्सक्लूड करें | filterOutAllExcept("name", "id") |
| serializeAllExcept() | निर्दिष्ट फील्ड्स को छोड़कर सभी को सीरियलाइज करें | serializeAllExcept("password", "ssn") |
| filterOutAll() | सभी फील्ड्स को एक्सक्लूड करें | filterOutAll() |
| serializeAll() | सभी फील्ड्स को सीरियलाइज करें (डिफ़ॉल्ट) | serializeAll() |
डायनामिक फिल्टरिंग
// रनटाइम पर फिल्टर निर्णय
SimpleBeanPropertyFilter filter = new SimpleBeanPropertyFilter() {
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen,
SerializerProvider provider, PropertyWriter writer)
throws Exception {
if (isAllowed(writer.getName())) {
writer.serializeAsField(pojo, jgen, provider);
}
}
@Override
protected boolean include(BeanPropertyWriter writer) {
return isAllowed(writer.getName());
}
private boolean isAllowed(String name) {
// रनटाइम लॉजिक (उदाहरण: यूजर रोल, परमिशन)
return !name.equals("password");
}
};
मल्टीपल फिल्टर्स
FilterProvider filters = new SimpleFilterProvider()
.addFilter("userFilter", filterOutAllExcept("name", "email"))
.addFilter("adminFilter", serializeAll())
.setFailOnUnknownId(false); // अज्ञात फिल्टर ID पर फेल न करें
// राइटर के साथ उपयोग
mapper.writer(filters).writeValueAsString(user);
उपयोग के मामले
- सिक्योरिटी: संवेदनशील डेटा (पासवर्ड, SSN, टोकन) छिपाना
- API वर्जनिंग: अलग-अलग क्लाइंट्स के लिए अलग फील्ड्स
- रोल-बेस्ड व्यूज: एडमिन vs यूजर vs पब्लिक व्यू
- परफॉरमेंस: बड़े ऑब्जेक्ट्स से अनावश्यक फील्ड्स को एक्सक्लूड करना
नोट
@JsonFilter डायनामिक फिल्टरिंग के लिए शक्तिशाली है लेकिन @JsonView या @JsonIgnore की तुलना में अधिक जटिल है। सरल केसेस के लिए @JsonView पर विचार करें।