2013-06-27 3 views
6

मैं इस मुद्दे को हो रही है लौटने के लिए, मैं नहीं चाहता कि कि इस मुद्दे को हल लेकिन कहने के लिए जिस तरह से करने के लिए खोजने के लिए GSON "त्रुटियों छोड़ने और जारी रखने" पार्स हैं:GSON से बचने JsonSyntaxException आंशिक मानचित्रण

Can't parses json : java.lang.IllegalStateException: 
    Expected a string but was BEGIN_OBJECT at line 1 column 16412 

कोड प्रयुक्त:

JsonReader reader = new JsonReader(new StringReader(data)); 
reader.setLenient(true); 
Articles articles = gson.create().fromJson(reader, Articles.class); 

डेटा (सरलीकृत करने के लिए): आलेख-> पेज-> medias.fields। वर्तमान त्रुटि में एक फ़ील्ड को स्ट्रिंग के रूप में परिभाषित किया गया है लेकिन मुझे ऑब्जेक्ट प्राप्त हो रहा है (लेकिन फिर यह केवल एक घटना है)। मैं सुरक्षा हर जगह नहीं जोड़ सकते तो मेरे सवाल यह है:? "वहाँ एक को छोड़ और GSON में जारी है

मैं GSON साथ JsonSysntaxException से बचना चाहते हैं जब वहाँ एक नोड पर एक मुद्दा है और मैं कम से कम आंशिक पुनः प्राप्त करने की उम्मीद डेटा पार्स किया गया। मेरे मामले में मेरे पास 99.9 99% डेटा था और केवल मेरा गलत क्षेत्र शून्य था ... मुझे पता है कि यह साफ नहीं लगता है, लेकिन मैं इकाई परीक्षण के लिए "सख्त मोड" या समस्या का पता लगाने के लिए निरंतर एकीकरण को सक्षम करता हूं उत्पादन मैं एक "मुलायम मोड" सक्षम करता हूं, इसलिए मेरा एप्लिकेशन शुरू हो सकता है (यहां तक ​​कि जब सर्वर पक्ष त्रुटियां कर रहा है)। मैं अपने कस्टम से नहीं कह सकता हूं, आपका ऐप शुरू नहीं हो सकता है क्योंकि आपके आलेख में एक आक्रमण डेटा है।

क्या GSON है लीजिये " छोड़ें और त्रुटि पर जारी रखें "?

+0

हमें कोड दिखाएं ?? – ajduke

+0

क्या आप वेब-सेवा से प्रतिक्रिया पोस्ट कर सकते हैं, इससे आपकी समस्या को हल करने में और मदद मिलेगी – KOTIOS

+0

मैंने कोड जोड़ा और मैं इस समस्या को ठीक नहीं करना चाहता हूं लेकिन इस अपवाद को ट्रिगर करने का कोई तरीका नहीं ढूंढता जब केवल एक पत्ता/नोड एक खराब प्रारूप से प्रभावित है। क्या यह संभव है ? – Gros

उत्तर

2

मुझे लगता है कि उत्तर बस है: नहीं, आम तौर पर यह नहीं कर सकता।

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

1

यहाँ समाधान है: आप TypeAdapterFactory जो आप डिफ़ॉल्ट TypeAdapter, रोकना, लेकिन अभी भी आप TypeAdapter एक प्रतिनिधि के रूप डिफ़ॉल्ट का उपयोग करने की अनुमति देगा छोड़ बनाना होगा। फिर आप डिफॉल्ट टाइपएडाप्टर से प्रतिनिधि का उपयोग करके मूल्य पढ़ने की कोशिश कर सकते हैं और अपनी इच्छानुसार अप्रत्याशित डेटा को संसाधित कर सकते हैं।

 public Gson getGson() { 

       return new GsonBuilder() 
          .registerTypeAdapterFactory(new LenientTypeAdapterFactory()) 
       .create(); 
      } 


     class LenientTypeAdapterFactory implements TypeAdapterFactory { 

       public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { 

        final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); 

        return new TypeAdapter<T>() { 

         public void write(JsonWriter out, T value) throws IOException { 
          delegate.write(out, value); 
         } 

         public T read(JsonReader in) throws IOException { 
          try { //Here is the magic 
//Try to read value using default TypeAdapter 
           return delegate.read(in); 
          } catch (JsonSyntaxException e) { 
//If we can't in case when we expecting to have an object but array is received (or some other unexpected stuff), we just skip this value in reader and return null 
           in.skipValue(); 
           return null; 
          } 
         } 
        }; 
       } 
    }