2011-11-22 13 views
7

क्या ऑब्जेक्टमैपर में वैश्विक संपत्ति फ़िल्टर को पंजीकृत करने का कोई तरीका है? वैश्विक अर्थ यह है कि यह सभी धारावाहिक सेम पर लागू किया जाएगा। मैं एनोटेशन का उपयोग नहीं कर सकता (मैं क्रमबद्ध बीन्स को संशोधित नहीं कर सकता) और यह नहीं पता कि सेम के गुण क्या हैं। फ़िल्टरिंग नाम आधारित होना चाहिए।जैक्सन में वैश्विक संपत्ति फ़िल्टर

मेरा पहला विचार कस्टम सीरिएलाइज़र लिखना था, लेकिन मुझे नहीं पता कि मैं कन्स्ट्रक्टर को क्या पास करूँगा।

उत्तर

9

मैं फ़िल्टरप्रोवाइडर का उपयोग करता हूं। यह थोड़ा सा शामिल है, लेकिन बहुत कमजोर नहीं है।

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectWriter; 
import org.codehaus.jackson.map.annotate.JsonFilter; 
import org.codehaus.jackson.map.ser.FilterProvider; 
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter; 
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Bar bar = new Bar(); 
    bar.id = "42"; 
    bar.name = "James"; 
    bar.color = "blue"; 
    bar.foo = new Foo(); 
    bar.foo.id = "7"; 
    bar.foo.size = "big"; 
    bar.foo.height = "tall"; 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    System.out.println(mapper.writeValueAsString(bar)); 
    // output: 
    // {"id":"42","name":"James","color":"blue","foo":{"id":"7","size":"big","height":"tall"}} 

    String[] ignorableFieldNames = { "id", "color" }; 

    FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); 

    mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 
    mapper.getSerializationConfig().addMixInAnnotations(Object.class, PropertyFilterMixIn.class); 
    ObjectWriter writer = mapper.writer(filters); 

    System.out.println(writer.writeValueAsString(bar)); 
    // output: 
    // {"name":"James","foo":{"size":"big","height":"tall"}} 
    } 
} 

@JsonFilter("filter properties by name") 
class PropertyFilterMixIn 
{ 

} 

class Bar 
{ 
    String id; 
    String name; 
    String color; 
    Foo foo; 
} 

class Foo 
{ 
    String id; 
    String size; 
    String height; 
} 

अन्य दृष्टिकोण और अधिक जानकारी के लिए, मैं निम्नलिखित संसाधनों की अनुशंसा करता हूं।

+0

एक आकर्षण की तरह काम करता है :) जैक्सन डॉक्स में सुधार के लिए जगह का एक बहुत नहीं है। – DAN

+0

रुचि के लिए, मैंने नाम से गुणों को फ़िल्टर करने के लिए आवश्यक कॉन्फ़िगरेशन को सरल बनाने के लिए http://jira.codehaus.org/browse/JACKSON-724 पर एक वृद्धि अनुरोध लॉग किया है। –

+0

@DAN बिल्कुल! योगदान दस्तावेज़ीकरण के लिए विशेष रूप से स्वागत है! (अच्छे लेखों के लिंक सहित, विकी अपडेट) – StaxMan

संबंधित मुद्दे