포함 된 개체를 반환하는 사용자 지정 deserializer를 작성합니다.
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
with 를 생성 GsonBuilder
하고 deserializer를 등록하면 :
Gson gson =
new GsonBuilder()
.registerTypeAdapter(Content.class, new MyDeserializer())
.create();
JSON을 직접 역 직렬화 할 수 있습니다 Content
.
Content c = gson.fromJson(myJson, Content.class);
댓글에서 추가하려면 수정 :
다른 유형의 메시지가 있지만 모두 "content"필드가있는 경우 다음을 수행하여 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()
형식이 deserializer로 전달되므로 모든 형식에 대해 작동합니다.
마지막으로 Retrofit 인스턴스를 만들 때 :
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();