2011-08-18 6 views
136

डिफ़ॉल्ट जैकन व्यवहार दोनों गुणों (गेटर्स और सेटर्स) और फ़ील्ड को जेसन के क्रमबद्ध और deserialize करने के लिए प्रतीत होता है।केवल जैकसन को फ़ील्ड का उपयोग करने के लिए निर्दिष्ट करने के लिए - अधिमानतः वैश्विक रूप से

मैं फ़ील्ड का उपयोग धारावाहिक विन्यास के कैनोलिक स्रोत के रूप में करना चाहता हूं और इस प्रकार जैक्सन को गुणों को देखने की इच्छा नहीं है।

मैं टिप्पणी के साथ एक व्यक्ति वर्ग के आधार पर कर सकते हैं:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

लेकिन मैं हर एक वर्ग पर डाल करने के लिए नहीं चाहता ...

यह संभव करने के लिए है इसे वैश्विक रूप से कॉन्फ़िगर करें? ऑब्जेक्ट मैपर में कुछ जोड़ने की तरह?

+1

टिम ने एक अच्छा जवाब दिया। एक और संभावना यह है कि यदि आपके पास एक सामान्य आधार वर्ग है, तो आप कक्षा में एनोटेशन डाल सकते हैं; जैक्सन द्वारा टिप्पणियां विरासत में मिली हैं। – StaxMan

+1

मुझे लगता है कि मैंने कोशिश की, लेकिन ऐसा लगता है कि आपको बेस क्लास परिभाषित करने के लिए उप वर्गों को बताना होगा ... –

+2

नहीं, जब तक उप-वर्ग कक्षा एनोटेशन ओवरराइड नहीं करता है, माता-पिता की टिप्पणियां दिखाई देती हैं जैसे कि वे उप- कक्षा परिभाषा (यदि नहीं, तो यह एक बग होगा)। यह जरूरी नहीं है कि जेडीके एनोटेशन से कैसे निपटता है, लेकिन जैक्सन एनोटेशन के लिए पूर्ण विरासत लागू करता है (विधि एनोटेशन के लिए भी)। – StaxMan

उत्तर

117

आप इस तरह अलग-अलग ObjectMappers कॉन्फ़िगर कर सकते हैं:

ObjectMapper mapper = new ObjectMapper(); 
mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker() 
       .withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
       .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
       .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
       .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 

यदि आप चाहते हैं यह विश्व स्तर पर निर्धारित करते हैं, मैं आमतौर पर एक आवरण वर्ग के माध्यम से एक के लिए कॉन्फ़िगर नक्शाकार एक्सेस करते हैं।

+3

अच्छा, हालांकि मुझे लगता है कि आपको चेकर भी सेट करने की आवश्यकता हो सकती है (withXxx() विधियां आम तौर पर एक नई वस्तु बनाती हैं)। तो कुछ 'mapper.setVisibilityChecker (mapper.getVisibilityChecker() के साथ ...);' – StaxMan

+0

@StaxMan सेट विज़िबिलिटी चेकर पर अच्छी कॉल, मैंने प्रतिबिंबित करने के लिए उत्तर संपादित किया। –

+32

'withGetterVisibility' में 'is *' विधियों को शामिल नहीं किया गया है, लेकिन उनके लिए 'GGetterVisibility' के साथ' है। – qerub

103

जैक्सन 2.0 में और बाद में आप बस का उपयोग कर सकते हैं:

import com.fasterxml.jackson.annotation.JsonAutoDetect; 
import com.fasterxml.jackson.annotation.PropertyAccessor; 
import com.fasterxml.jackson.databind.ObjectMapper; 

... 

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

autodetection बंद करने के लिए।

+1

हाय दोस्तों, मैं जैक्सन 1.9.0 जार का उपयोग कर रहा हूं। मुझे जेसन स्ट्रिंग पर ऑब्जेक्ट को क्रमबद्ध करते समय अतिरिक्त जेसन संपत्ति मिल रही है। मुझे जेसन स्ट्रिंग प्राप्त करने की आवश्यकता है, जिसमें @JsonProperty के साथ केवल निर्दिष्ट चर शामिल हैं। क्या आप कृपया इस पर मेरी सहायता कर सकते हैं? – jrhamza

+6

आप ओपी प्रश्न में उल्लिखित कक्षा एनोटेशन के साथ शुरू कर सकते हैं: '@JsonAutoDetect (फ़ील्ड दृश्यता = दृश्यता.NONE, getterVisibility = दृश्यता.NONE, setterVisibility = Visibility.NONE)' अगला, आपको प्रत्येक संपत्ति को एनोटेट करना होगा जिसमें आप शामिल करना चाहते हैं '@ जेसनप्रोपर्टी – lukk

10

जैक्सन 1.9.10 के लिए मैं

ObjectMapper mapper = new ObjectMapper(); 

mapper.setVisibility(JsonMethod.ALL, Visibility.NONE); 
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY); 

का उपयोग ऑटो dedection की बारी करने के। क्यों न

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

कोई

setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE); 
    setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); 
    setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

मेरी बूलियन गेटर/सेटर के लिए काम नहीं करता:

+1

यही तरीका है। धन्यवाद। – cuneytykaya

+0

आश्चर्य है कि ऐसा करने और "ऑटो डिटेक्ट्स" को अक्षम करने के बीच कोई अंतर है या नहीं। – xenoterracide

22

मैं समय की एक बहुत खर्च करते हैं है। समाधान simpe है:

@JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...   
    setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE); 
+0

क्या आप विस्तारित कर सकते हैं कि बीन कक्षा में कितना सरल समाधान लागू किया जाना चाहिए? –

+1

धन्यवाद। वह है गेटटर ने मेरे लिए दिन बचाया। – grinch

7

इस बारे में कैसे:

@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE) 
public static class TelemetryMixin {} 

उपयोग::

मैं इसे एक mixin

अनुपालन न करने वाले वस्तु

@Entity 
@Getter 
@NoArgsConstructor 
public class Telemetry { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long pk; 
    private String id; 
    private String organizationId; 
    private String baseType; 
    private String name; 
    private Double lat; 
    private Double lon; 
    private Instant updateTimestamp; 
} 

Mixin के साथ प्रयोग किया जाता

ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class); 
    Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class); 

ऐसा कुछ भी नहीं है जो कहता है कि आप किसी भी वर्ग की भविष्यवाणी नहीं कर सकते हैं और उसी मिश्रण को लागू नहीं कर सकते हैं।

यदि आप मिश्रित से परिचित नहीं हैं, तो वे अवधारणात्मक रूप से सरल हैं: मिश्रण वर्ग की संरचना सुपर क्लास लक्षित वर्ग पर (जैक्सन के अनुसार, जहां तक ​​JVM का संबंध नहीं है)।

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

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