मैं JSON संरचना है इस प्रकार की तरह -पुराना वापस gson कनवर्टर
{
"status": true,
"message": "Registration Complete.",
"data": {
"user": {
"username": "user88",
"email": "[email protected]",
"created_on": "1426171225",
"last_login": null,
"active": "1",
"first_name": "User",
"last_name": "",
"company": null,
"phone": null,
"sign_up_mode": "GOOGLE_PLUS"
}
}
}
प्रारूप से ऊपर आम है। केवल data
कुंजी, user
, product
तरह की जानकारी के विभिन्न प्रकार के हो सकते हैं invoice
आदि
मैं हर बाकी जवाब में एक ही status
, message
और data
कुंजी रखना चाहते हैं। data
का इलाज status
और message
के अनुसार किया जाएगा उपयोगकर्ता को प्रदर्शित किया जाएगा।
तो मूल रूप से, उपरोक्त प्रारूप सभी एपिस में वांछित है। प्रत्येक बार data
कुंजी के अंदर की जानकारी प्रत्येक बार अलग होगी।
और मैं सेटअप एक निम्नलिखित वर्ग है और इसे सेट अप gson कनवर्टर के रूप में - MyResponse.java
public class MyResponse<T> implements Serializable{
private boolean status ;
private String message ;
private T data;
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
Deserializer.java
class Deserializer<T> implements JsonDeserializer<T>{
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException{
JsonElement content = je.getAsJsonObject();
// Deserialize it. You use a new instance of Gson to avoid infinite recursion to this deserializer
return new Gson().fromJson(content, type);
}
}
और यह प्रयोग किया जाता है इस प्रकार है -
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(MyResponse.class, new Deserializer<MyResponse>());
...... ..... ....
restBuilder.setConverter(new GsonConverter(gsonBuilder.create()));
सेवा इंटरफ़ेस इस प्रकार है -
@POST("/register")
public void test1(@Body MeUser meUser, Callback<MyResponse<MeUser>> apiResponseCallback);
@POST("/other")
public void test2(Callback<MyResponse<Product>> apiResponseCallback);
समस्या
मैं कॉलबैक अंदर से status
और message
क्षेत्रों तक पहुँच सकते हैं। लेकिन data
कुंजी के अंदर की जानकारी पार्स नहीं की गई है और MeUser
और Product
जैसे मॉडल हमेशा खाली के रूप में लौटते हैं।
मैं कोड ऊपर का पालन करने के json संरचना बदलते हैं पूरी तरह से काम करता है -
{
"status": true,
"message": "Registration Complete.",
"data": {
"username": "user88",
"email": "[email protected]",
"created_on": "1426171225",
"last_login": null,
"active": "1",
"first_name": "User",
"last_name": "",
"company": null,
"phone": null,
"sign_up_mode": "GOOGLE_PLUS"
}
}
मैं इसे कैसे data
ऑब्जेक्ट के अंदर अलग कुंजी निर्दिष्ट के साथ काम किया है और इसे सफलतापूर्वक पार्स हो सकती है? क्योंकि data
विशेषता T
जो आप प्रकार MeUser
, Product
, आदि के होने की उम्मीद के रूप में परिभाषित किया गया है
जानना चाहते हैं कि आप क्या कर रहे हैं –
जीएसओएन सामान्य डेटा प्रकार 'निजी टी डेटा; 'पार्सिंग करते समय ध्यान में न लें। यह कुछ विशिष्ट डेटा प्रकार होना चाहिए। –
'T' के बजाय इस डेटा वर्ग का उपयोग करें।'वर्ग DataClass { \t \t @SerializedName (" उपयोगकर्ता ") उपयोगकर्ता \t \t UserClass; // उपयोगकर्ता वस्तु \t \t @SerializedName (" उत्पाद ") \t \t ProductClass उत्पाद; // उत्पाद वस्तु \t \t @ SerializedName ("चालान") \t \t InvoiceClass चालान; // चालान वस्तु \t \t वर्ग UserClass { \t \t} \t \t वर्ग ProductClass { \t \t} \t \t वर्ग InvoiceClass { \t \t} \t} ' –