2015-06-03 7 views
7

मैं एक JSON प्रतिक्रिया से वस्तुओं की एक सूची de-serialize करने की कोशिश कर रहा हूँ। जेएसओएन सरणी में एक कुंजी है, जो जीएसओएन को डी-सीरियलाइज करने के लिए समस्याओं का कारण बन रही है।वस्तुओं की एक लिपटे सूची की जीएसओएन deserialization

मेरे पास इस तरह के लगभग 20 ऑब्जेक्ट हैं।

public class Device extends Entity { 
    String device_id; 
    String device_type; 
    String device_push_id; 
} 

अधिकांश के लिए एक एपीआई विधि है जो वस्तुओं की एक सूची देता है। लौटा JSON इस तरह दिखता है। अन्य ग्राहकों की वजह से, जेएसओएन के प्रारूप को बदलना इस बिंदु पर एक उचित विकल्प नहीं है।

{ 
    "devices":[ 
     { 
     "id":"Y3mK5Kvy", 
     "device_id":"did_e3be5", 
     "device_type":"ios" 
     }, 
     { 
     "id":"6ZvpDPvX", 
     "device_id":"did_84fdd", 
     "device_type":"android" 
     } 
    ] 
} 

आदेश प्रतिक्रिया के इस प्रकार पार्स करने के लिए मैं वर्तमान में org.json तरीकों और Gson का मिश्रण का उपयोग कर रहा हूँ।

JSONArray jsonResponse = new JSONObject(response).getJSONArray("devices"); 

Type deviceListType = new TypeToken<List<Device>>() {}.getType(); 
ArrayList<Device> devices = gson.fromJson(jsonResponse.toString(), deviceListType); 

मैं desrialization करने की एक क्लीनर विधि की तलाश में हूं क्योंकि मैं रेट्रोफिट का उपयोग करना चाहता हूं। Get nested JSON object with GSON using retrofit में उत्तर मुझे जो चाहिए, उसके करीब है, लेकिन List एस को संभाल नहीं करता है। मैंने यहां उत्तर के सामान्य संस्करण की प्रतिलिपि बनाई है:

public class RestDeserializer<T> implements JsonDeserializer<T> { 
    private Class<T> mClass; 
    private String mKey; 

    public RestDeserializer(Class<T> targetClass, String key) { 
    mClass = targetClass; 
    mKey = key; 
    } 

    @Override 
    public T deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) 
    throws JsonParseException { 

    JsonElement value = jsonElement.getAsJsonObject().get(mKey); 
    if (value != null) { 
     return new Gson().fromJson(value, mClass); 
    } else { 
     return new Gson().fromJson(jsonElement, mClass); 
    } 
    } 
} 

मेरा लक्ष्य यह कॉल "बस काम" करना है।

@GET("/api/v1/protected/devices") 
public void getDevices(Callback<List<Device>> callback); 
+0

कस्टम यह एक सरल 'सूची ' की आवश्यकता नहीं है? यदि क्षेत्र का नाम जेसन नाम से अलग है तो बस '@ SerializedName' एनोटेशन का उपयोग करें। रेट्रोफिट आपके लिए पार्सिंग करेगा –

+0

आप अपने deserializer कैसे बनाते हैं और पंजीकरण करते हैं? – Gomino

+0

मैं वर्तमान में deserializer का उपयोग नहीं कर रहा हूँ क्योंकि यह वास्तव में इस मुद्दे को हल नहीं करता है। – Derek

उत्तर

1

public class Devices { 

@Expose 
private List<Device> devices = new ArrayList<Device>(); 

/** 
* 
* @return 
* The devices 
*/ 
public List<Device> getDevices() { 
return devices; 
} 

/** 
* 
* @param devices 
* The devices 
*/ 
public void setDevices(List<Device> devices) { 
this.devices = devices; 
} 

} 

डिवाइस वर्ग

public class Device extends Entity { 
    @Expose 
    String id; 
    @Expose 
    String device_id; 
    @Expose 
    String device_type; 
} 

या

public class Device extends Entity { 
    @Expose @SerializedName("id") 
    String deviceId; 
    @Expose @SerializedName("device_id") 
    String devicePushId; 
    @Expose @SerializedName("device_type") 
    String deviceType; 
} 

अद्यतन पुराना वापस

०१२३५१६४१० को विधि नीचे वर्ग का प्रयोग करें
@GET("/api/v1/protected/devices") 
public void getDevices(Callback<Devices> callback); 

devices.getDevices() //call inside callback method will give you the list 

इसके अलावा, आप अभ्यस्त deserializer

+0

मैंने इसे माना, और वास्तव में यह है कि यदि कोई सामान्य विकल्प नहीं आता तो मैं ऐसा करूंगा। हालांकि, मेरे पास 20+ ऑब्जेक्ट्स हैं, इसलिए मैं सूचियों को लपेटने के लिए 20 अतिरिक्त कक्षाओं से बचने की उम्मीद कर रहा हूं। – Derek

+0

इसके बजाय @GET ("/ api/v1/संरक्षित/डिवाइस") सार्वजनिक शून्य प्राप्त करने के लिए प्रयास करें (कॉलबैक कॉलबैक कॉलबैक); मैंने यह स्वयं नहीं किया है, अगर यह काम करता है तो मुझे बताएं .. यदि यह – 3xplore

+0

काम करता है तो आपको अतिरिक्त ऑब्जेक्ट बनाना नहीं है जो काम नहीं करता है। एक मुद्दा यह है कि जीसन को कैसे पता चलेगा कि "डिवाइस" नामक जेसन तत्व सही है, इसकी सूची या डिवाइस [] खोजने के लिए अनदेखा करना है। – Derek

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