在這種情況下,我將實現父對象的自定義JsonDeserializer
,並傳播Author
信息,像這樣:
public class AuthorDeserializer implements JsonDeserializer<Author> {
@Override
public Author deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
final JsonObject authorObject = json.getAsJsonObject();
Author author = new Author();
author.name = authorObject.get("name").getAsString();
Type booksListType = new TypeToken<List<Book>>(){}.getType();
author.books = context.deserialize(authorObject.get("books"), booksListType);
for(Book book : author.books) {
book.author = author;
}
return author;
}
}
請注意,我的例子中省略了錯誤檢查。你會使用它,像這樣:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Author.class, new AuthorDeserializer())
.create();
要顯示它的工作,我脫下只是「作者」從你的例子關鍵JSON,讓我做到這一點:
JsonElement authorsJson = new JsonParser().parse(json).getAsJsonObject().get("authors");
Type authorList = new TypeToken<List<Author>>(){}.getType();
List<Author> authors = gson.fromJson(authorsJson, authorList);
for(Author a : authors) {
System.out.println(a.name);
for(Book b : a.books) {
System.out.println("\t " + b.title + " by " + b.author.name);
}
}
打印了:
Stephen King
Carrie by Stephen King
The Shining by Stephen King
Christine by Stephen King
Pet Sematary by Stephen King
'有沒有可能不使用自定義解串器? 「我不認爲這是可能的,因爲性質如何反序列化。 '是否仍然可以用定製的解串器來做到這一點?'是的,有可能這樣做。只需查找有關該部分的教程,stackoverflow就此主題提供了幾個問題和答案。 –
@Tezla你能指點我一篇文章或一個解釋我如何實現這一點的stackoverflow,因爲我沒有找到任何東西。這就是爲什麼我決定發佈我的問題。它會幫助我很多。 – Thermech