2015-09-07 7 views
8

पर डाला गया मुझे पता था कि इस सवाल से पहले पूछा गया है। जावा और एंड्रॉइड में मेरे नौसिखिया कौशल के कारण। मैं इस मुद्दे को एक हफ्ते से अधिक समय तक हल नहीं कर सकता।google gson LinkedTreeMap क्लास myclass

मेरे दोस्त में से एक और मैं एंड्रॉइड प्रोजेक्ट विकसित कर रहा था, इस तरह की कुछ चीजें हैं।

इन चीजों का सबसे अजीब हिस्सा यह है कि यह केवल तब होता है जब मैं इसे Google Play store से डाउनलोड और परीक्षण करता हूं। स्थानीय एंड्रॉइड स्टूडियो स्थापना या डीबग मोड से नहीं।

यहां समस्या क्या हो सकती है, या यह लौटने वाली सूची जो पूरी तरह से गलत है? मेरे दोस्त को यह विश्वास है कि यह कोड सही ढंग से लौटाता है लेकिन प्ले स्टोर स्थापना से यह हमेशा एक त्रुटि होती है।

कृपया मुझे सुझाव दें कि मुझे खुदाई कहां रखना चाहिए?

@Override 
public void promiseMethod(JSONObject object) { 
    if (object != null) { 

     if (object.has(DO_SERVICES)) { 
      vehicleDetails = new ArrayList <Object[]> (1); 
      List <String> vehicleNoList = new ArrayList <String> (1); 
      List <String> serviceList = new ArrayList <String> (1); 
      try { 
       Gson gson = new Gson(); 
       JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES) 
        .toString()); 
       servDto = gson.fromJson(jsonObj.toString(), 
        ServiceDto.class); 


       if (servDto.getServiceDto() instanceof List) { 

        List <DoServiceDto> doServiceList = servDto.getServiceDto(); 

अपवाद है

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap com.gaurage.user.User_Test_Main पर com.gaurage.dto.DoServiceDto में ढाला नहीं जा सकता .promiseMethod (अज्ञात स्रोत)

+0

कृपया मुझे सुझाव दें कि मुझे किसी को भी अधिक कोड पोस्ट करने की आवश्यकता है –

+0

सप्ताह से अधिक समय के लिए अजीब समस्या है और इसे वोट दिया गया है ... मैंने कहा कि स्थानीय स्थापना में यह काम प्ले स्टोर स्थापना से नहीं –

+0

कृपया पहले प्रश्न और कोड को समझें मतदान नीचे। मेरे अद्यतन उत्तर को देखो। –

उत्तर

34

serializing और deserializing जेनेरिक प्रकार

जब आप toJson (obj) कहते हैं, Gson कैलोरी sersize करने के लिए फ़ील्ड पर जानकारी प्राप्त करने के लिए ls obj.getClass()। इसी तरह, आप आमतौर पर MyJass.class ऑब्जेक्ट को json (json, MyClass.class) विधि में पास कर सकते हैं। यदि ऑब्जेक्ट एक गैर-सामान्य प्रकार है तो यह ठीक काम करता है। हालांकि, यदि ऑब्जेक्ट सामान्य प्रकार का है, तो सामान्य प्रकार की जानकारी जावा टाइप एरर के कारण खो जाती है। यहाँ एक उदाहरण बिंदु को दर्शाता हुआ है:

class Foo<T> { T value;} 
Gson gson = new Gson(); 
Foo<Bar> foo = new Foo<Bar>(); 
gson.toJson(foo); // May not serialize foo.value correctly 
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar 

ऊपर कोड प्रकार बार के रूप में मूल्य व्याख्या करने के लिए क्योंकि Gson list.getClass() का आह्वान अपने वर्ग में जानकारी प्राप्त करने में विफल रहता है, लेकिन इस पद्धति एक कच्चे वर्ग देता है, Foo.class । इसका मतलब है कि जीसन को यह जानने का कोई तरीका नहीं है कि यह फू प्रकार का एक वस्तु है, न केवल सादा फू।

आप अपने सामान्य प्रकार के लिए सही पैरामीटरयुक्त प्रकार निर्दिष्ट करके इस समस्या को हल कर सकते हैं। आप टाइपटेकन क्लास का उपयोग कर ऐसा कर सकते हैं।

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();  
gson.toJson(foo, fooType); 
gson.fromJson(json, fooType); 

मेरे पास अभिभावक वर्ग है और इसमें बाल वर्ग में से कुछ में सूची प्रकार हैं। इस अभिभावक वर्ग की तरह मेरे पास 30 फाइलें हैं। मैंने इसे इस तरह हल किया।

Gson gson = new Gson(); 
JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES).toString()); 
Type type = new TypeToken<MyDto>() {}.getType(); 
servDto = gson.fromJson(jsonObj.toString(),type); 

सबसे महत्वपूर्ण बात, मैं एंड्रॉयड स्टूडियो से स्थानीय परीक्षण में इस त्रुटि पुन: पेश नहीं कर सकता है। यह समस्या केवल पॉप अप होती है, जब मैं प्लेस्टोर में हस्ताक्षरित एपीके उत्पन्न करता हूं और ऐप प्रकाशित करता हूं, तो ऐप बंद हो जाता है, और रिपोर्ट कहती है कि LinkedTreeMap को Myclass पर नहीं डाला जा सकता है।

मेरे स्थानीय परीक्षण (डीबग मोड सहित) में एक ही परिणाम को पुन: उत्पन्न करना मेरे लिए मुश्किल था।

+1

जो मेरे लिए काम करता है, धन्यवाद :) –

+2

प्रोगार्ड (minifyEnabled true) का प्रयोग करते समय पुन: उत्पन्न होता है – Pnemonic

+1

@ Log.d धन्यवाद, यह मेरे लिए काम करता है। इस मुद्दे को महसूस करने में 6 घंटे लग गए और आपकी पोस्ट में आया। –