2012-04-20 15 views
6

मुझे लगता है कि जैक्सन विधि आधारित क्रमबद्धता करता है, क्या कोई तरीका है कि मैं इसे क्षेत्र आधारित बना सकता हूं?जैक्सन क्षेत्र आधारित क्रमबद्धता

पूर्व:

class Bean { 
    Integer i; 
    String s; 

    public Integer getI() { return this.i; } 
    public void setI(Integer i) { this.i = i; } 
    public bool isSetI() { return this.i != null; } 

    // same for s as well 
} 

उत्पादन JSON "मैं" और "SETI" है। क्या वैसे भी मैं इसे "मैं" पाने के लिए ओवरराइड कर सकता हूं? यह भी अच्छा होगा अगर कक्षा में कोई एनोटेशन जोड़ने के बिना ऐसा करने का कोई तरीका था (वे स्वतः उत्पन्न होते हैं)।

+1

यह कोड संकलित नहीं करता है। क्या आप वास्तविक कोड पोस्ट कर सकते हैं जिसका आप उपयोग कर रहे हैं साथ ही आप क्रमबद्ध करने की कोशिश कैसे कर रहे हैं? –

उत्तर

5

एनोटेशन के बिना यह पूरा करने के लिए आप निम्न तरीके से serializing/deserializing से पहले ObjectMapper कॉन्फ़िगर कर सकते हैं:

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

जैक्सन फ़ील्ड का भी उपयोग कर सकते हैं, हां; लेकिन डिफ़ॉल्ट रूप से केवल सार्वजनिक फ़ील्ड की खोज की जाती है। लेकिन आप गैर-सार्वजनिक फ़ील्ड को चिह्नित करने के लिए @JsonProperty का उपयोग कर सकते हैं।

ध्यान देने योग्य एक बात यह है कि यदि कोई विधि (सेटएक्स, getX) और फ़ील्ड (x) है, तो विधि की प्राथमिकता होगी। यह आम तौर पर एक समस्या नहीं है, लेकिन यदि ऐसा है, तो आपको स्पष्ट रूप से @JsonIgnore जोड़ने के द्वारा उपयोग की जाने वाली विधि को अक्षम करने की आवश्यकता नहीं है।

10

@JsonAutoDetect एनोटेशन देखें। उदाहरण:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE) 
public class Bean { 
    Integer i; 
    String s; 

    Integer getI() { return this.i; } 
    void setI(Integer i) { this.i = i; } 
    bool isSetI() return { this.i == null; } 

    // same for s as well 
} 
3

स्वीकार किए जाते हैं जवाब मेरे लिए अपेक्षित परिणाम नहीं मिला। क्या मेरे लिए एनोटेशन निम्नलिखित तरीके से ObjectMapper को विन्यस्त है जोड़े बिना काम करता है:

ObjectMapper om = new ObjectMapper() 
     .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) 
     .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

इस तरह मेरे लिए और अधिक समझ बनाने के लिए लगता है कि, जो खेतों ही टिककर खेल \ मानक जावा क्रमांकन तरह setters के बजाय का उपयोग करता है होगा कर।

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