यह @SerializedName
Gson में एक क्षेत्र में कई एनोटेशन को परिभाषित करने के लिए समर्थित नहीं है ।
कारण: डिफ़ॉल्ट रूप से Deserialization को एक LinkedHashMap के साथ प्रबंधित किया जाता है और इनकमिंग आने वाले जॉन्स फ़ील्ड नाम (कस्टम क्लास के फ़ील्ड नाम या क्रमबद्ध नाम नहीं) द्वारा परिभाषित किए जाते हैं और एक से एक मैपिंग होती है। आप ReflectiveTypeAdapterFactory
कक्षा की आंतरिक कक्षा Adapter<T>
की read(JsonReader in)
विधि में कार्यान्वयन (कैसे deserialization काम करता है) देख सकते हैं ।
समाधान:
आप एक कस्टम लिख सकते हैं TypeAdapter जो हैंडल name
, person
और user
json टैग और उन्हें अपने कस्टम वर्ग का नाम क्षेत्र के लिए नक्शे MyClass
:
class MyClassTypeAdapter extends TypeAdapter<MyClass> {
@Override
public MyClass read(final JsonReader in) throws IOException {
final MyClass myClassInstance = new MyClass();
in.beginObject();
while (in.hasNext()) {
String jsonTag = in.nextName();
if ("id".equals(jsonTag)) {
myClassInstance.id = in.nextInt();
} else if ("name".equals(jsonTag)
|| "person".equals(jsonTag)
|| "user".equals(jsonTag)) {
myClassInstance.name = in.nextString();
}
}
in.endObject();
return myClassInstance;
}
@Override
public void write(final JsonWriter out, final MyClass myClassInstance)
throws IOException {
out.beginObject();
out.name("id").value(myClassInstance.id);
out.name("name").value(myClassInstance.name);
out.endObject();
}
}
परीक्षण का मामला:
String jsonVal0 = "{\"id\": 5382, \"user\": \"Mary\" }";
String jsonVal1 = "{\"id\": 2341, \"person\": \"Bob\"}";
final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MyClass.class, new MyClassTypeAdapter());
final Gson gson = gsonBuilder.create();
MyClass myClassInstance0 = gson.fromJson(jsonVal0, MyClass.class);
MyClass myClassInstance1 = gson.fromJson(jsonVal1, MyClass.class);
System.out.println("jsonVal0 :" + gson.toJson(myClassInstance0));
// output: jsonVal0 :{"id":5382,"name":"Mary"}
System.out.println("jsonVal1 :" + gson.toJson(myClassInstance1));
// output: jsonVal1 :{"id":2341,"name":"Bob"}
TypeAdapters के बारे में उदाहरण।
संपादित करें 2016.04.06: जैसा कि @Mathieu Castets ने अपने उत्तर में लिखा है, यह अब समर्थित है। (यह इस प्रश्न का सही उत्तर है।)
सार्वजनिक अमूर्त स्ट्रिंग [] वैकल्पिक
रिटर्न: फ़ील्ड का वैकल्पिक नाम जब यह डीरिशियल
डिफॉल्ट होता है: {}