2013-01-13 9 views
5

हम जैक्सन के साथ JSON क्रमबद्धता का उपयोग डीबगिंग गुणों के लिए सिस्टम की आंतरिक स्थिति का पर्दाफाश करने के लिए करते हैं।जैक्सन का उपयोग कर क्षणिक क्षेत्रों को क्रमबद्ध करने के लिए कैसे?

डिफ़ॉल्ट रूप से जैक्सन क्षणिक क्षेत्रों को क्रमबद्ध नहीं करता है - लेकिन मैं उन्हें क्रमबद्ध करना चाहता हूं। मैं इन क्षेत्रों को क्रमबद्ध कैसे कर सकता हूं?

एक तरीका मुझे पता है कि इन क्षेत्रों के लिए एक गेटर्स की आपूर्ति करना है - लेकिन मैं ऐसा नहीं करना चाहता, क्योंकि मेरे पास कुछ getX विधियां हैं जिन्हें मैं बुलाया नहीं चाहता (उदाहरण के लिए, कुछ गेटर्स हैं जो वस्तुओं को बदलता है)।

मुझे पता है कि मैं एक एनोटेशन बना सकता हूं, लेकिन मैं वास्तव में इसे टालना चाहता हूं।

तो मेरा प्रश्न है: क्या क्रमशः क्रमशः क्रमबद्ध करने के लिए जैक्सन सेट करने का कोई तरीका है? क्षणिक लोगों को शामिल करें।

+1

आप @ javax.persistence.Transient क्षेत्रों क्रमानुसार करने, देखें [गेयर जवाब] (http://stackoverflow.com/a/29109806/606662) चाहते हैं: –

+0

@Markus Pscheidt साथ सहमत – dirai

उत्तर

6

मुझे नहीं लगता कि जैक्सन किसी भी प्रकार की कॉन्फ़िगरेशन का समर्थन करता है ताकि इसे एक क्षणिक क्षेत्र को क्रमबद्ध करने में सक्षम बनाया जा सके। उस सुविधा को जोड़ने के लिए एक खुला मुद्दा नहीं है, लेकिन वह पुराना हो और संबोधित नहीं किया गया है (जहाँ तक मैं बता सकता हूँ): http://jira.codehaus.org/browse/JACKSON-623

तो मेरे सवाल है: वहाँ सेटअप जैक्सन के लिए एक रास्ता सभी क्रमानुसार करने है वस्तुओं के खेतों? क्षणिक लोगों को शामिल करें।

तो अपने प्रश्न का उत्तर देने के लिए, नहीं।

कुछ अन्य जावा JSON उपकरण, जैसे कि GSON क्षणिक फ़ील्ड को क्रमबद्ध करने के लिए कॉन्फ़िगरेशन विकल्प का समर्थन करते हैं। यदि आप किसी अन्य टूल का उपयोग कर सकते हैं, तो आप उसमें देख सकते हैं (जीएसओएन के लिए, देखें: https://sites.google.com/site/gson/gson-user-guide)।

थोड़ा विस्तार करने के लिए, आप एक अलग दृष्टिकोण का प्रयास कर सकते हैं।

सबसे पहले, आपको एक क्षणिक क्षेत्र को क्रमबद्ध करने की कोशिश नहीं करनी चाहिए। क्षणिक की सभी परिभाषाओं के बाद "इसे क्रमबद्ध न करें।" फिर भी मैं कुछ विशिष्ट परिस्थितियों के बारे में सोच सकता हूं जहां यह आवश्यक हो सकता है, या कम से कम सुविधाजनक (जैसे कोड के साथ काम करते समय आप संशोधित नहीं कर सकते हैं)। फिर भी, 99% मामलों में, जवाब ऐसा नहीं करता है। फ़ील्ड को बदलें ताकि अगर आप इसे क्रमबद्ध करने की आवश्यकता हो तो यह क्षणिक नहीं है। यदि आपके पास एकाधिक संदर्भ हैं जहां आप एक ही क्षेत्र का उपयोग करते हैं, और आप इसे एक (जेएसओएन, उदाहरण के लिए) में क्रमबद्ध करना चाहते हैं, और दूसरे में क्रमबद्ध नहीं है (उदाहरण के लिए java.io) तो आपको उस मामले के लिए कस्टम सीरिएलाइज़र बनाना चाहिए आप कीवर्ड का दुरुपयोग करने के बजाय इसे नहीं चाहते हैं।

दूसरा, गेटटर का उपयोग करने और "ऑब्जेक्ट्स को बदलने वाले कुछ गेटर्स" रखने के लिए, आपको इससे बचने की कोशिश करनी चाहिए। इससे विभिन्न अनपेक्षित परिणाम हो सकते हैं। और, तकनीकी रूप से, यह एक गेटर नहीं है, यह एक सेटटर है। मेरा मतलब यह है कि, यदि यह राज्य को बदलता है, तो आपको एक्सेसर (गेटटर) के बजाय एक म्यूटेटर (सेटर) मिला है, भले ही आप इसे "प्राप्त करें" सम्मेलन के बाद नाम दें और कुछ सामान वापस कर दें।

0

आप उस क्षणिक क्षेत्र के लिए कस्टम गेटर बना सकते हैं और @XmlElement विशेषता का उपयोग कर सकते हैं। यह उस गेटर के नाम से कोई फर्क नहीं पड़ता।

उदाहरण के लिए:

public class Person { 

    @XmlTransient private String lastname; 

    @XmlElement(name="lastname") 
    public String getAnyNameOfMethod(){ 
     return lastname; 
    } 

} 
10

जैक्सन 2.4 के साथ मेरा समाधान।3:

private static final ObjectMapper mapper = 
     new ObjectMapper(){{ 

      Hibernate4Module module = new Hibernate4Module(); 
      module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION); 
      registerModule(module); 

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