मैं एक 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);
कस्टम यह एक सरल 'सूची' की आवश्यकता नहीं है? यदि क्षेत्र का नाम जेसन नाम से अलग है तो बस '@ SerializedName' एनोटेशन का उपयोग करें। रेट्रोफिट आपके लिए पार्सिंग करेगा –
आप अपने deserializer कैसे बनाते हैं और पंजीकरण करते हैं? – Gomino
मैं वर्तमान में deserializer का उपयोग नहीं कर रहा हूँ क्योंकि यह वास्तव में इस मुद्दे को हल नहीं करता है। – Derek