2015-08-28 7 views
23

को हटाकर आदिम बुलियन फ़ील्ड का नाम बदलता है यह डुप्लिकेट हो सकता है। लेकिन मुझे इसका समाधान नहीं मिला।जैक्सन 'है'

मैं एक वर्ग

public class MyResponse implements Serializable { 

    private boolean isSuccess; 

    public boolean isSuccess() { 
     return isSuccess; 
    } 

    public void setSuccess(boolean isSuccess) { 
     this.isSuccess = isSuccess; 
    } 
} 

getters और setters ग्रहण द्वारा उत्पन्न कर रहे है।

किसी अन्य वर्ग में, मैंने मान को सत्य पर सेट किया है, और इसे JSON स्ट्रिंग के रूप में लिखना है।

System.out.println(new ObjectMapper().writeValueAsString(myResponse)); 

JSON में, कुंजी {"success": true} के रूप में आ रही है।

मुझे कुंजी isSuccess के रूप में चाहिए। जैक्सन serialization के दौरान सेटटर विधि का उपयोग कर रहा है? फ़ील्ड नाम के रूप में कुंजी कैसे बनाएं?

+0

अगर अपनी संपत्ति नाम liek है 'isSuccess'you विधि नाम 'isIsSuccess' होना चाहिए मुझे लगता है कि – Jens

+0

मैं समझता हूं। मैंने सोचा कि यह 'SetSuccess' बेहतर है क्योंकि यह ग्रहण द्वारा उत्पन्न होता है। (मानक के बाद) – iCode

उत्तर

28

यह एक थोड़ा देर से जवाब है, लेकिन हो सकता है इस पृष्ठ पर आने वाले किसी और के लिए उपयोगी।

नाम है कि जैक्सन जब JSON के serializing के लिए इस्तेमाल करेगा बदलने के एक सरल समाधान @JsonProperty एनोटेशन उपयोग करने के लिए है, इसलिए अपने उदाहरण बन जाएगा:

public class MyResponse implements Serializable { 

    private boolean isSuccess; 

    @JsonProperty(value="isSuccess")   
    public boolean isSuccess() { 
     return isSuccess; 
    } 

    public void setSuccess(boolean isSuccess) { 
     this.isSuccess = isSuccess; 
    } 
} 

यह तो {"isSuccess":true} के रूप में JSON के लिए धारावाहिक की जाएगी, लेकिन आपके गेटटर विधि नाम को संशोधित करने का लाभ नहीं है।

नोट के रूप में यह केवल एक value तत्व है कि इस मामले में आप भी @JsonProperty("isSuccess") के रूप में एनोटेशन लिख सकता है

9

मैंने हाल ही में इस मुद्दे में भाग लिया और यही मुझे मिला। जैक्सन किसी भी वर्ग का निरीक्षण करेगा जिसे आप गेटर्स और सेटर्स के लिए पास करते हैं, और क्रमिकरण और deserialization के लिए उन तरीकों का उपयोग करें। उन विधियों में "प्राप्त करें", "है" और "सेट" का पालन करने के लिए JSON फ़ील्ड ("isValid" getIsValid और setIsValid के लिए कुंजी के रूप में उपयोग किया जाएगा)।

public class JacksonExample { 

    private boolean isValid = false; 

    public boolean getIsValid() { 
     return isValid; 
    } 

    public void setIsValid(boolean isValid) { 
     this.isValid = isValid; 
    } 
} 

इसी तरह "isSuccess" "सफलता", हो जाएगा करने के लिए "isIsSuccess" या "getIsSuccess" नाम दिया है जब तक कि

यहां अधिक पढ़ें: http://www.citrine.io/blog/2015/5/20/jackson-json-processor

+3

isValid जावा में बूलियन डेटा प्रकार के लिए सही नामकरण सम्मेलन नहीं है। वैध होना चाहिए और वैध है(), setValid() – vels4j

+0

लेकिन क्या यह बिल्कुल ठीक नहीं होना चाहिए? एक सम्मेलन? यदि यह अस्तित्व में है, तो क्या आप जैक्सन संदर्भ से लिंक कर सकते हैं जो कहता है कि यह जेएसओएन फ़ील्ड के रूप में गेटर नामों का उपयोग करता है? या आपको लगता है कि यह एक खराब डिजाइन पसंद है? –

+0

मेरी इच्छा है कि इसके लिए एक चेतावनी थी – RyPope

1

बिल्डिंग पर उत्कर्ष के जवाब ..

मनुष्य नाम शून्य से मिल/ के रूप में प्रयोग किया जाता है JSON नाम।

public class Example{ 
    private String radcliffe; 

    public getHarryPotter(){ 
     return radcliffe; 
    } 
} 

के रूप में संग्रहीत किया जाता है { "harrypotter": "whateverYouGaveHere"}


दोनों सेटर और फ़ील्ड नाम के खिलाफ Deserialization, जैक्सन की जाँच करता है। जेसन स्ट्रिंग {"word1": "example"} के लिए, नीचे दोनों मान्य हैं।

public class Example{ 
    private String word1; 

    public setword2(String pqr){ 
     this.word1 = pqr; 
    } 
} 

public class Example2{ 
    private String word2; 

    public setWord1(String pqr){ 
     this.word2 = pqr ; 
    } 
} 

एक और अधिक दिलचस्प सवाल जो आदेश जैक्सन अक्रमांकन के लिए विचार करती है।अगर मैं { "WORD1": "Myname"} deserialize करने की कोशिश

public class Example3{ 
    private String word1; 
    private String word2; 

    public setWord1(String parameter){ 
     this.word2 = parameter ; 
    } 
} 

साथ मैं उपरोक्त मामले का परीक्षण नहीं किया है, लेकिन यह word1 & WORD2 के मूल्यों को देखने के लिए दिलचस्प हो जाएगा। ..

नोट: मैंने जोर देने के लिए बहुत सारे नामों का उपयोग किया कि किन क्षेत्रों को समान होना आवश्यक है।

1

इस समस्या के लिए एक और तरीका है।

बस एक नया उप-वर्ग परिभाषित करें PropertyNamingStrategy को विस्तारित करता है और इसे ऑब्जेक्टमैपर उदाहरण में पास करता है।

यहाँ एक कोड स्निपेट मदद की जा सकती है और अधिक:

mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() { 
     @Override 
     public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { 
      String input = defaultName; 
      if(method.getName().startsWith("is")){ 
       input = method.getName(); 
      } 

      //copy from LowerCaseWithUnderscoresStrategy 
      if (input == null) return input; // garbage in, garbage out 
      int length = input.length(); 
      StringBuilder result = new StringBuilder(length * 2); 
      int resultLength = 0; 
      boolean wasPrevTranslated = false; 
      for (int i = 0; i < length; i++) 
      { 
       char c = input.charAt(i); 
       if (i > 0 || c != '_') // skip first starting underscore 
       { 
        if (Character.isUpperCase(c)) 
        { 
         if (!wasPrevTranslated && resultLength > 0 && result.charAt(resultLength - 1) != '_') 
         { 
          result.append('_'); 
          resultLength++; 
         } 
         c = Character.toLowerCase(c); 
         wasPrevTranslated = true; 
        } 
        else 
        { 
         wasPrevTranslated = false; 
        } 
        result.append(c); 
        resultLength++; 
       } 
      } 
      return resultLength > 0 ? result.toString() : input; 
     } 
    }); 
0

उदाहरण के लिए आप Jakson वस्तु नक्शाकार के विन्यास जोड़ना चाहिए:

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
converter.getObjectMapper().disable(MapperFeature.AUTO_DETECT_IS_GETTERS);