2015-02-04 8 views
20

मैंने आज एक अलग प्रश्न में यह पूछा लेकिन मुझे डर है कि इसका कोई समाधान नहीं मिलेगा क्योंकि इसे कैसे phrased किया गया था।जीसन - समान फ़ील्ड नाम, विभिन्न प्रकार

Json

आप देख सकते हैं, option_value आइटम एक वस्तु में किसी सरणी और एक अन्य वस्तु में एक साधारण स्ट्रिंग है:

मैं एक json इनपुट निम्न डेटा है कि है।

मैं इसे कैसे ठीक से जीसन संभाल सकता हूं? मेरी कक्षा यह एक सूची वस्तु के रूप में वर्णित किया गया है, तो यह पहले कुछ आइटम जहां option_value एक सरणी है के लिए काम करता है, लेकिन जब यह एक स्ट्रिंग ऐप्लिकेशन क्रैश हो जाता है और मैं एक json पार्स अपवाद मिलता है।

क्या इसके लिए कोई कामकाज है?

अद्यतन

के रूप में अनुरोध मेरी कक्षा का प्रासंगिक हिस्सा जोड़ना:

public class Options 
    { 
     String product_option_id; 
     String option_id; 
     String name; 
     String type; 
     String required; 
     List<OptionValue> option_value; 

     // get set stuff here 

     public class OptionValue 
     { 
      String product_option_value_id; 
      String option_value_id; 
      String name; 
      String image; 
      String price; 
      String price_prefix; 

      // get set stuff here 
     } 
    } 
+0

हाय असिम, क्या आप अपना जेसन पार्सर दिखा सकते हैं? – Kansen

+0

प्रासंगिक भाग जोड़ा गया। मैं जीसन का उपयोग कर रहा हूं इसलिए Gson.fromJson (स्ट्रिंग, क्लास) फ़ंक्शन का उपयोग करके उस लाइब्रेरी द्वारा पार्सिंग किया जाता है। – Asim

+0

आप 'GSON.fromJson (स्ट्रिंग जेसन, कक्षा क्लासऑफटी) का उपयोग करके इसे प्राप्त नहीं कर सकते हैं, आपको अपने एडाप्टर को परिभाषित करना होगा ...' com.google.gson.TypeAdapter' कक्षा को विस्तारित करके 'StrangeJsonAdapter' कहें। । फिर अपने जेसन को डीकोड करने के लिए 'StrangeJsonAdapter.fromJson (स्ट्रिंग जेसन)' विधि का उपयोग करें। –

उत्तर

16

मैं तुम्हारे लिए एक समाधान :) इस उद्देश्य हम कस्टम deserializer का उपयोग करना चाहिए के लिए है। इस तरह अपनी कक्षा रीमेक:

public class Options{ 

    @SerializedName ("product_option_id"); 
    String mProductOptionId; 

    @SerializedName ("option_id"); 
    String mOptionId; 

    @SerializedName ("name"); 
    String mName; 

    @SerializedName ("type"); 
    String mType; 

    @SerializedName ("required"); 
    String mRequired; 

    //don't assign any serialized name, this field will be parsed manually 
    List<OptionValue> mOptionValue; 

    //setter 
    public void setOptionValues(List<OptionValue> optionValues){ 
     mOptionValue = optionValues; 
    } 

    // get set stuff here 
    public class OptionValue 
    { 
     String product_option_value_id; 
     String option_value_id; 
     String name; 
     String image; 
     String price; 
     String price_prefix; 

     // get set stuff here 
    } 

public static class OptionsDeserilizer implements JsonDeserializer<Options> { 

    @Override 
    public Offer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     Options options = new Gson().fromJson(json, Options.class); 
     JsonObject jsonObject = json.getAsJsonObject(); 

     if (jsonObject.has("option_value")) { 
      JsonElement elem = jsonObject.get("option_value"); 
      if (elem != null && !elem.isJsonNull()) { 
       String valuesString = elem.getAsString(); 
       if (!TextUtils.isEmpty(valuesString)){ 
        List<OptionValue> values = new Gson().fromJson(valuesString, new TypeToken<ArrayList<OptionValue>>() {}.getType()); 
        options.setOptionValues(values); 
       } 
      } 
     } 
     return options ; 
    } 
} 
} 

इससे पहले कि हम दे सकते हैं gson पार्स json, हम अपने कस्टम deserializer रजिस्टर करना चाहिए:

Gson gson = new GsonBuilder()    
      .registerTypeAdapter(Options.class, new Options.OptionsDeserilizer())    
      .create(); 

और अब - बस फोन:

Options options = gson.fromJson(json, Options.class); 
+1

मुझे 'विकल्प विकल्प = नया जीसन() से जेसन (जेसन, विकल्प.क्लास) पर रिकर्सिव deserialization कॉल के कारण एक StackOverflowError मिला; 'और दो नए' जीसन' उदाहरण एक ही वस्तु के deserialization में बनाए जाते हैं। बाहर देखो। – EpicPandaForce

2

में मेरी स्थिति, समान नाम वाला फ़ील्ड "डेटा" है: {} या "डेटा": [array_with_real_data]। तो स्वीकार्य उत्तर से कोड को थोड़ा संशोधित करने की आवश्यकता है, जैसे:

@Override 
public MyClass deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 
    MyClass bean = new Gson().fromJson(json, MyClass.class); 
    JsonObject jsonObject = json.getAsJsonObject(); 

    if (jsonObject.has("data")) { 
     JsonArray array = jsonObject.getAsJsonArray("data"); 
     if (array != null && !array.isJsonNull()) { 
      List<Data> data = new Gson().fromJson(array, new TypeToken<ArrayList<Data>>() {}.getType()); 
      bean.realData = data; 
     } 
    } 
    return bean ; 
} 

आशा है कि मदद करता है।

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