जैक्सन: क्षेत्र क्रमांकन को कैसे रोका जाए


163

मेरे पास पासवर्ड फ़ील्ड के साथ एक इकाई वर्ग है:

class User {
    private String password;

    //setter, getter..
}

मैं चाहता हूं कि इस क्षेत्र को क्रमबद्धता के दौरान छोड़ दिया जाए। लेकिन यह अभी भी DEserialize करने में सक्षम होना चाहिए। यह आवश्यक है, ताकि क्लाइंट मुझे एक नया पासवर्ड भेज सके, लेकिन वर्तमान को पढ़ने में सक्षम नहीं है।

मैं इसे जैक्सन के साथ कैसे पूरा करूं?


1
आप इसे क्रमबद्ध नहीं करना चाहते हैं, लेकिन आप इसे हटाना चाहते हैं? यह असंभव है, मैं कहूंगा। यदि आप एक बॉक्स में कुकी नहीं डालते हैं, तो आप इसे इस बॉक्स से पुनर्प्राप्त नहीं कर पाएंगे।
एलेक्सिस डुफ्रेनॉय

1
@ टैरो: लेकिन मैं एक नई कुकी डाल सकता हूं। मैं बस एक सुविधाजनक एनोटेशन खोज रहा हूं, लेकिन यह निश्चित रूप से हाथ से किया जा सकता है।
वीकेंड

8
त्वरित टिप्पणी: यह पूरी तरह से संभव है, तकनीकी रूप से, एक सेटर का उपयोग किया जाता है (यहां तक ​​कि निजी भी ऑटो-डिटेक्ट किए गए हैं), और बस ओटिट एक्सेसर (कोई सार्वजनिक क्षेत्र या गेट्टर) नहीं है। @JsonIgnoreगेटटर पर जोड़ना भी संभव है , लेकिन @JsonPropertyसेटर पर, जिस स्थिति में चीजें क्रमबद्ध नहीं होती हैं, लेकिन deserialized हो सकती हैं।
स्टेक्समैन

4
क्या आप इस प्रश्न का उत्तर स्वीकार करना चाहेंगे? (आपके कुछ और लोग कुछ साल पुराने हैं और अभी भी अस्वीकार्य हैं ... कृपया समीक्षा पर विचार करें!) :) पूर्ण प्रकटीकरण - मेरे पास इनमें से किसी भी सवाल का कोई जवाब नहीं है।
21

जवाबों:


187

आप इसे चिह्नित कर सकते हैं @JsonIgnore

1.9 के साथ, आप @JsonIgnoreगेट्टर के लिए, @JsonPropertyसेटर के लिए जोड़ सकते हैं , इसे deserialize बनाने के लिए, लेकिन क्रमबद्ध नहीं।


6
@JsonIgnore deserialization को भी रोकता है। क्षणिक के लिए - मैं इसकी जाँच करूँगा।
वीकेंड

98
1.9 के साथ, आप @JsonIgnoreगेट्टर के लिए, @JsonPropertyसेटर के लिए जोड़ सकते हैं , इसे deserialize बनाने के लिए, लेकिन क्रमबद्ध नहीं।
StaxMan

StaxMan की टिप्पणी का उत्तर होना चाहिए, है ना? क्यों यह अभी भी एक टिप्पणी है ...?!
सरवनबलगी रामचंद्रन

क्षणिक मेरे लिए काम नहीं कर रहा है, मैंने "क्षणिक" क्षेत्र को चिह्नित किया है कि मैं यह नहीं चाहता हूं कि इसे सीरीज़ / निरस्त किया जाए।
रोहिथ

यह उत्तर पहले transient(जैसा कि private transient String password;) का उपयोग करने का सुझाव दिया गया था, लेकिन जब तक MapperFeature.PROPAGATE_TRANSIENT_MARKER सक्षम नहीं होता, तब तक सार्वजनिक गेट के साथ क्षणिक फ़ील्ड को अनदेखा कर दिया जाता है।
टॉम

96

यह बताते हुए कि स्टेक्समैन ने क्या कहा है, यह मेरे लिए काम करता है

private String password;

@JsonIgnore
public String getPassword() {
    return password;
}

@JsonProperty
public void setPassword(String password) {
    this.password = password;
}

12
आप किस जसन निर्भरता का उपयोग करते हैं? यह com.fasterxml.jackson के साथ काम नहीं करता है
अलेक्जेंडर बुरकेविच

3
धन्यवाद! @JsonIgnoreऐसा लगता है कि मैदान पर जरूरी नहीं है।
फेरन मेक्लिन

com.fasterxml.jackson.annotation.JsonIgnore from jackson-annotations <<version> .jar
mvmn

मैंने यह कोशिश की है और यह मेरे लिए काम नहीं कर रहा है। मैं v2.8 का उपयोग करता हूं। कोई मदद?
मेजर

36

आसान तरीका यह है कि अपने गेटर्स और सेटर को एनोटेट करें।

यहाँ सादा पाठ पासवर्ड को बाहर करने के लिए मूल उदाहरण को संशोधित किया गया है, लेकिन फिर एक नई पद्धति की व्याख्या करें जो कूटशब्द को कूटशब्द के रूप में लौटाता है।

class User {

    private String password;

    public void setPassword(String password) {
        this.password = password;
    }

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty("password")
    public String getEncryptedPassword() {
        // encryption logic
    }
}

21

जैक्सन 2.6 के साथ शुरू , एक संपत्ति को पढ़ने-या केवल लिखने के रूप में चिह्नित किया जा सकता है। यह दोनों एक्सेसरों पर एनोटेशन को हैक करने की तुलना में सरल है और सभी सूचनाओं को एक स्थान पर रखता है:

public class User {
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
}

यह एक बढ़िया समाधान है, सरल, काम कर रहा है। धन्यवाद।
dhqvinh

17

इसके अलावा @JsonIgnore, कुछ अन्य संभावनाएं हैं:

  • सशर्त रूप से फ़ील्ड को फ़िल्टर करने के लिए JSON व्यूज़ का उपयोग करें (डिफ़ॉल्ट रूप से, डिसेरिएलाइज़ेशन के लिए उपयोग नहीं किया जाता है; 2.0 में उपलब्ध होगा, लेकिन आप क्रमांकन, डिसेरलाइज़ेशन पर अलग-अलग दृश्य का उपयोग कर सकते हैं)
  • @JsonIgnoreProperties कक्षा में उपयोगी हो सकता है

10

transientमेरे लिए समाधान है। धन्यवाद! यह जावा का मूल निवासी है और आपको एक और फ्रेमवर्क-विशिष्ट एनोटेशन जोड़ने से बचा जाता है।


2
उदाहरण के लिए, यदि आपकी विशेषता वास्तव में क्षणिक है, ORM शामिल नहीं है, तो काम करता है .... पाया गया कि @JsonIgnore मेरे मामले में अधिक दिलचस्प है, हालाँकि मुझे जैकसन पर बंद कर दिया जाएगा, लेकिन यह एक अच्छा व्यापार है
जोआ परेरा

3
यदि आप अपना एनोटेशन बनाते हैं और आपको JsonIgnore और JacksonAnnotationsInside द्वारा एनोटेट किया गया है तो आपको जैकसन पर लॉक होने की आवश्यकता नहीं है। इस तरह, यदि आप धारावाहिक बदलते हैं, तो आपको केवल अपना एनोटेशन बदलना होगा।
डेविड

4

किसी को यह पूछना चाहिए कि आप पासवर्ड के लिए सार्वजनिक रूप से विधि क्यों चाहते हैं। हाइबरनेट, या किसी भी अन्य ओआरएम फ्रेमवर्क, एक निजी गेट्टर विधि के साथ करेंगे। पासवर्ड सही है या नहीं, इसकी जाँच के लिए, आप उपयोग कर सकते हैं

public boolean checkPassword(String password){
  return this.password.equals(anyHashingMethod(password));
}

मुझे वास्तव में लगता है कि समाधान के बारे में सोचने का यह सबसे अच्छा तरीका है। यह उन चीजों को बनाने के लिए अधिक समझ में आता है जिन्हें आपको निजी की आवश्यकता होती है और उन्हें ऑब्जेक्ट से ही नियंत्रित करते हैं।
अर्चिनुम

2

जैक्सन के पास SimpleBeanPropertyFilter नाम का एक वर्ग है जो क्रमांकन और डीरिएलाइज़ेशन के दौरान खेतों को फ़िल्टर करने में मदद करता है; विश्व स्तर पर नहीं। मुझे लगता है कि आप यही चाहते थे।

@JsonFilter("custom_serializer")
class User {
    private String password;

    //setter, getter..
}

फिर अपने कोड में:

String[] fieldsToSkip = new String[] { "password" };

ObjectMapper mapper = new ObjectMapper();

final SimpleFilterProvider filter = new SimpleFilterProvider();
filter.addFilter("custom_serializer",
            SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip));

mapper.setFilters(filter);

String jsonStr = mapper.writeValueAsString(currentUser);

यह passwordक्षेत्र को क्रमबद्ध होने से रोकेगा । इसके अलावा, आप passwordफ़ील्ड्स को डिसेरिएलाइज़ करने में सक्षम होंगे जैसा कि यह है। बस सुनिश्चित करें कि ObjectMapper ऑब्जेक्ट पर कोई फ़िल्टर लागू नहीं किया गया है।

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(yourJsonStr, User.class);    // user object does have non-null password field

0

के रूप में चर सेट करें

@JsonIgnore

यह वेरिएबल को जॅन्सन सीरियलाइज़र द्वारा छोड़ दिया जाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.