2013-05-10 7 views
41

मैं एक वर्ग एक जो कुछ निजी क्षेत्रों की है और एक ही कक्षा एक और कक्षा बी जो भीवर्ग एक से अधिक JSON क्षेत्रों

public class A extends B { 
    private BigDecimal netAmountTcy; 
    private BigDecimal netAmountPcy; 
    private BigDecimal priceTo; 
    private String segment; 

    private BigDecimal taxAmountTcy; 
    private BigDecimal taxAmountPcy; 
    private BigDecimal tradeFeesTcy; 
    private BigDecimal tradeFeesPcy; 

// getter and setter for the above fields 

} 

और वर्ग बी है जो वर्ग ए में हैं कुछ निजी क्षेत्रों है फैली हुई है वाणी मिला कुछ निजी fiedls जो अब कक्षा एक

में हैं जब मैं कक्षा एक मैं निम्न अपवाद प्राप्त ऊपर से JSON स्ट्रिंग बनाने का प्रयास करें:

class com.hexgen.ro.request.A declares multiple JSON fields named netAmountPcy 

यह कैसे तय करने के लिए?

चूंकि वे निजी क्षेत्र हैं, इसलिए मुझे लगता है कि जेसन स्ट्रिंग बनाने के दौरान कोई समस्या नहीं होनी चाहिए लेकिन मुझे यकीन नहीं है।

मैं निम्नलिखित की तरह json स्ट्रिंग बनाने के लिए:

Gson gson = new Gson(); 
tempJSON = gson.toJson(obj); 

यहाँ obj वर्ग एक

+0

पोस्ट अपने सुपर वर्ग बी – NPKR

उत्तर

46

की वस्तु है क्योंकि वे निजी क्षेत्रों देखते हैं किसी भी समस्या नहीं होनी चाहिए json स्ट्रिंग बनाने के दौरान

मुझे नहीं लगता कि यह कथन सत्य है, जीएसओएन ऑब्जेक्ट के निजी फ़ील्ड को क्रमबद्ध करते समय देखता है, जिसका मतलब है कि सुपरक्लास के सभी निजी क्षेत्र शामिल हैं, और जब आपके पास समान नाम वाले फ़ील्ड हैं एक त्रुटि फेंकता है।

कोई विशेष क्षेत्र जिसे आप शामिल करना आप transient कीवर्ड, जैसे के साथ चिह्नित करने के लिए नहीं करना चाहती है, तो:

private transient BigDecimal tradeFeesPcy; 
+0

धन्यवाद यह काम करता है। लेकिन क्यों @ जीसन का एनोटेशन सुपररेक्लास क्षेत्र के साथ काम नहीं करता है और यह भ्रम पैदा कर रहा है ?? – Fakher

+0

निजी क्यों महत्वपूर्ण है? सुरक्षित भी संरक्षित है? – Tomer

+1

@ फ़ैकर को 'एक्सपोज़' प्राप्त करने के लिए ठीक से काम करने की आवश्यकता है, आपको '@ एक्सप्लोज़ (सीरियलइज़ = झूठा)' सेट करने की आवश्यकता है और अपने 'जीसनबिल्डर' ऑब्जेक्ट पर 'बहिष्कृत करेंथथआउट एक्सप्लोरेशनऑनोटेशन()' को कॉल करना सुनिश्चित करें। – bitsnaps

46

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

public class SuperclassExclusionStrategy implements ExclusionStrategy 
{ 
    public boolean shouldSkipClass(Class<?> arg0) 
    { 
     return false; 
    } 

    public boolean shouldSkipField(FieldAttributes fieldAttributes) 
    { 
     String fieldName = fieldAttributes.getName(); 
     Class<?> theClass = fieldAttributes.getDeclaringClass(); 

     return isFieldInSuperclass(theClass, fieldName);    
    } 

    private boolean isFieldInSuperclass(Class<?> subclass, String fieldName) 
    { 
     Class<?> superclass = subclass.getSuperclass(); 
     Field field; 

     while(superclass != null) 
     { 
      field = getField(superclass, fieldName); 

      if(field != null) 
       return true; 

      superclass = superclass.getSuperclass(); 
     } 

     return false; 
    } 

    private Field getField(Class<?> theClass, String fieldName) 
    { 
     try 
     { 
      return theClass.getDeclaredField(fieldName); 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 
    } 
} 

इस प्रकार मैं तो बिल्डर में क्रमबद्धता और Deserialization बहिष्कार रणनीति तय:

builder.addDeserializationExclusionStrategy(new SuperclassExclusionStrategy()); 
    builder.addSerializationExclusionStrategy(new SuperclassExclusionStrategy()); 

उम्मीद है कि इस मदद करता है किसी को यहाँ उस वर्ग के लिए अपने कोड है!

+2

यह सही जवाब है क्योंकि मैं सुपरक्लास 'ऑब्जेक्ट को धारावाहिक प्राप्त करने से बाहर नहीं करना चाहता, मैं नहीं चाहता कि जीएसओएन विस्तारित वर्ग' चर या तो – CQM

+4

एड्रियन को बाहर कर दे; तुम सुंदर, सुंदर आदमी। – tipu

+3

मेरी राय में यह गलत तरीका है। इस प्रकार आपके जेसन में सुपर क्लास से वेरिएबल होगा, और सबक्लास का मान छुपाया जाएगा। एक उम्मीद है कि यह दूसरी तरफ है; जेसन में उपclass चर है, और superclass चर छुपाएं। – Veda

0

मेरे मामले मैं काफी गूंगा एक्स वर्ग के साथ एक एडाप्टर रजिस्टर, और वाई वर्ग के साथ fromJson क्रमानुसार करने की कोशिश करने का था:

 final GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(Game.class, new TournamentSerializer()); 
     final Gson gson = gsonBuilder.create(); 

     createdTournament = gson.fromJson(jsonResponse.toString(), Tournament.class); 
5

वही त्रुटि संदेश भी होता है अगर आप विभिन्न क्षेत्रों है, लेकिन वे है वही @SerializedName

@SerializedName("date_created") 
private Date DateCreated; 
@SerializedName("date_created") 
private Integer matchTime; 

कॉपी/पेस्ट करना आप बस ऐसी गलती कर सकते हैं। तो, कक्षा और उसके पूर्वजों कक्षा में देखें और इसके लिए जांचें।

1

प्रोजेवार्ड के नीचे निम्नलिखित पंक्तियां जोड़ें।config (यदि आप इस परियोजना में ProGuard उपयोग कर रहे हैं)

-keepclassmembers class * { 
    private <fields>;  
} 
संबंधित मुद्दे