2013-01-17 27 views
13

का उपयोग कर जेसन प्रतिक्रिया सरणी/ऑब्जेक्ट को गतिशील रूप से कैसे प्रबंधित करें मुझे समस्या का सामना करना पड़ रहा है, कभी-कभी जेसन प्रतिक्रिया ऑब्जेक्ट्स की एक सरणी देता है, कभी-कभी ऑब्जेक्ट करता है, हम प्रतिक्रिया वर्ग में गतिशील रूप से कैसे संभाल सकते हैं। वर्तमान जैसे में: परिणाम कभी कभी वस्तुओंजीसन

"\"results\": " + 
      "[{" + 

की एक सरणी हो जाता है और कभी-कभी खुद को आपत्ति

"\"results\": " + 
      "{" + 

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

हम इस संभाल कर सकते हैं कैसे?

Gson gson = new Gson(); 
    SearchResponse response=new SearchResponse(); 
    response= gson.fromJson("{" + 
      "\"completed_in\": 0.047," + 
      "\"max_id\": 291771567376039936," + 
      "\"max_id_str\": \"291771567376039936\"," + 
      "\"next_page\": \"?page=2&max_id=291771567376039936&q=javacodegeeks\"," + 
      "\"page\": 1," + 
      "\"query\": \"javacodegeeks\"," + 
      "\"refresh_url\": \"?since_id=291771567376039936&q=javacodegeeks\"," + 
      "\"results\": " + 
      "{" + 
      "\"created_at\": \"Thu, 17 Jan 2013 04:58:57 +0000\"," + 
      "\"from_user\": \"hkokko\"," + 
      "\"from_user_id\": 24726686," + 
      "\"from_user_id_str\": \"24726686\"," + 
      " \"from_user_name\": \"Hannu Kokko\"," + 
      " \"geo\": null," + 
      "\"id\": 291771567376039936," + 
      "\"id_str\": \"291771567376039936\"," + 
      "\"iso_language_code\": \"en\"," + 
      " \"metadata\": {" + 
      "\"result_type\": \"recent\"}," + 
      "\"profile_image_url\": \"hjh\"," + 
      "\"profile_image_url_https\": \"kkj\"," + 
      "\"source\": \"<a href="hj;\"," + 
      "\"text\": \"Continuous Deployment: Are You Afraid It Might Work? jh\"," + 
      "\"to_user\": null," + 
      "\"to_user_id\": 0," + 
      "\"to_user_id_str\": \"0\"," + 
      "\"to_user_name\": null" + 
      " }," + 
      "\"results_per_page\": 15," + 
      "\"since_id\": 0," + 
      "\"since_id_str\": \"0\"" + 
      "}", SearchResponse.class); 
    System.out.println(response.toString()); 

कृपया सहायता ...

किसी को भी इस लक्ष्य को हासिल करने के लिए विभिन्न जार का उपयोग करके किसी भी सुझाव दे सकते हैं?

+0

इस तरह के सर्वर प्राप्ति वास्तविक अच्छा एक नहीं है। यह तुम्हारा बैक एंड है? – Evos

+0

अपने क्लाइंट, मुझे सर्वर से यह प्रतिक्रिया प्राप्त होती है .. – Rockin

+0

यदि सर्वर ऑब्जेक्ट की सरणी देता है तो क्या इसमें हमेशा एक ऑब्जेक्ट होता है या इसमें एकाधिक हो सकते हैं? यदि यह एक सरणी है तो क्या आप इसके हर तत्व को खरीदते हैं? – dstronczak

उत्तर

16

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

public class ArrayAdapter<T> extends TypeAdapter<List<T>> { 
    private Class<T> adapterclass; 

    public ArrayAdapter(Class<T> adapterclass) { 

     this.adapterclass = adapterclass; 
    } 

    public List<T> read(JsonReader reader) throws IOException { 


     List<T> list = new ArrayList<T>(); 

     Gson gson = new Gson(); 

     if (reader.peek() == JsonToken.BEGIN_OBJECT) { 

      T inning = (T) gson.fromJson(reader, adapterclass); 
      list.add(inning); 

     } else if (reader.peek() == JsonToken.BEGIN_ARRAY) { 

      reader.beginArray(); 
      while (reader.hasNext()) { 
       T inning = (T) gson.fromJson(reader, adapterclass); 
       list.add(inning); 
      } 
      reader.endArray(); 

     } else { 
      reader.skipValue(); 
     } 

     return list; 
    } 

    public void write(JsonWriter writer, List<T> value) throws IOException { 

    } 

} 

public class ArrayAdapterFactory implements TypeAdapterFactory { 

    @SuppressWarnings({ "unchecked" }) 
    @Override 
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) { 

     ArrayAdapter typeAdapter = null; 
     try { 
      if (type.getRawType() == List.class) 
      { 

       typeAdapter = new ArrayAdapter(
         (Class) ((ParameterizedType) type.getType()) 
           .getActualTypeArguments()[0]); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return typeAdapter; 
} 

तो बस फोन

Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create(); 
SearchResponse response; 
esponse= gson.fromJson("your json string", SearchResponse.class) 
+0

यह टाइपएडाप्टर टाइपएडाप्टर = शून्य पर त्रुटि देता है; के लिए .. आप सार्वजनिक वर्ग ArrayAdapterFactory लागू करता TypeAdapterFactory तरह वर्ग हस्ताक्षर को संशोधित करके इस समस्या को हल कर सकते हैं { –

+0

com.google.gson.internal। $ Gson $ प्रकार $ ParameterizedTypeImpl java.lang.Class \t में ढाला नहीं जा सकता उपर्युक्त उदाहरण का उपयोग करते हुए मैपिंग करते समय त्रुटि मिल रही है –

3

आपको एक कस्टम deserializer लिखना होगा जो JSON में results के प्रकार की जांच करता है और उसके अनुसार कार्य करता है।

आपके पीओजेओ में results के लिए एक सरणी होगी और यदि आपके आने वाले JSON में केवल एक ही ऑब्जेक्ट है तो आपको इसे ठीक करने की आवश्यकता होगी। एक तरीका है JSON को संशोधित करना, फिर इसे deserialize:

class SearchResponseDeserializer implements JsonDeserializer<SearchResponse> { 
    public SearchResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 

    if (json.getAsJsonObject().get("results").isJsonObject()) { 
     //modify JSON: change results to be an array 
     // ... 
    } 

    return new Gson().fromJson(json, SearchResults.class); 

    } 
} 

या, सर्वर को ठीक करें। इस मुद्दे से बचने के लिए हमेशा एक सरणी वापस करनी चाहिए।

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