आप एक कस्टम डेज़रलाइज़र लिखते हैं जो एम्बेडेड ऑब्जेक्ट को वापस करता है।
मान लीजिए कि आपका JSON है:
{
"status":"OK",
"reason":"some reason",
"content" :
{
"foo": 123,
"bar": "some value"
}
}
फिर आपके पास एक Content
POJO होगा:
class Content
{
public int foo;
public String bar;
}
तो फिर तुम एक deserializer लिखें:
class MyDeserializer implements JsonDeserializer<Content>
{
@Override
public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
// Get the "content" element from the parsed JSON
JsonElement content = je.getAsJsonObject().get("content");
// Deserialize it. You use a new instance of Gson to avoid infinite recursion
// to this deserializer
return new Gson().fromJson(content, Content.class);
}
}
अब यदि आप एक निर्माण Gson
करते हैं GsonBuilder
और डेजिऐलाइज़र को पंजीकृत करते हैं:
Gson gson =
new GsonBuilder()
.registerTypeAdapter(Content.class, new MyDeserializer())
.create();
आप अपने JSON को सीधे अपने से अलग कर सकते हैं Content
:
Content c = gson.fromJson(myJson, Content.class);
टिप्पणियों से जोड़ने के लिए संपादित करें:
यदि आपके पास विभिन्न प्रकार के संदेश हैं, लेकिन उन सभी में "सामग्री" फ़ील्ड है, तो आप ऐसा करके Deserializer को सामान्य बना सकते हैं:
class MyDeserializer<T> implements JsonDeserializer<T>
{
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
// Get the "content" element from the parsed JSON
JsonElement content = je.getAsJsonObject().get("content");
// Deserialize it. You use a new instance of Gson to avoid infinite recursion
// to this deserializer
return new Gson().fromJson(content, type);
}
}
आपको अपने प्रत्येक प्रकार के लिए एक उदाहरण दर्ज करना होगा:
Gson gson =
new GsonBuilder()
.registerTypeAdapter(Content.class, new MyDeserializer<Content>())
.registerTypeAdapter(DiffContent.class, new MyDeserializer<DiffContent>())
.create();
जब आप कॉल .fromJson()
करते हैं तो टाइप को डेज़राइज़र में ले जाया जाता है, इसलिए इसे तब आपके सभी प्रकारों के लिए काम करना चाहिए।
और अंत में जब एक पुराना उदाहरण बना:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();