আপনি একটি কাস্টম ডিসরিওলাইজার লিখবেন যা এম্বেড থাকা অবজেক্টটিকে ফেরত দেয়।
আপনার JSON হ'ল বলুন:
{
"status":"OK",
"reason":"some reason",
"content" :
{
"foo": 123,
"bar": "some value"
}
}
তারপরে আপনার একটি Content
পজো হবে:
class Content
{
public int foo;
public String bar;
}
তারপরে আপনি একটি ডিসিরিয়ালাইজার লিখুন:
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();
আপনি সরাসরি আপনার জেএসওনকে ডিসিজায়ালাইজ করতে পারেন Content
:
Content c = gson.fromJson(myJson, Content.class);
মন্তব্য থেকে যোগ করতে সম্পাদনা করুন:
আপনার যদি বিভিন্ন ধরণের বার্তা থাকে তবে সেগুলির সবার কাছে "বিষয়বস্তু" ক্ষেত্র থাকে তবে আপনি এইটি করে ডিসিরিসালাইজারকে জেনেরিক তৈরি করতে পারেন:
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 retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();