想象一下图书库的以下 JSON:
{
"books": [{
"id": 562,
"name": "This is a booktitle"
},
{
"id": 875,
"name": "This is another booktitle"
}
]
}
要获取有关第一本书的更多信息,我只需提出一个请求 https://thislibrarydoesnotexists.com/books/562
,该请求将返回以下 JSON:
{
"name": "This is a booktitle",
"pages": 137,
"blurp": "This book is about the booktitle",
"authors": [{
"name": "Generic Author",
"id": 78
}]
}
现在我可以使用请求 https://thislibrarydoesnotexists.com/authors/78
来请求有关作者的更多信息,并且这个游戏会持续很长一段时间,直到我获得所有信息。
现在我的目标是拥有以下 java 类结构:
class Library{
List<Book> books
}
class Book{
String name;
int pages;
String blurp;
List<Author> authors;
}
class Author{...}
但是如何为此编写自定义反序列化器呢?这是迄今为止我最好的尝试:
final Gson defaultGson = new GsonBuilder.create();
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Book.class, new JsonDeserializer<Book>() {
@Override
public Skill deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
if(jsonObject.has("id")) { //It is just a link to a book
String bookJson = getJson("https://thislibrarydoesnotexists.com/books/" + jsonObject.get("id").getAsInt());
Book book = gson.fromJson(bookJson, Book.class);
return book;
}else {
Book book = defaultGson.fromJson(json, Book.class); //#1
return book;
}
}
});
gson = gsonBuilder.create();
此解决方案在#1处失败,因为作者的自定义反序列化器不会被使用。
解决这个问题的正确方法是什么?
- 在其他情况下手动创建 Book 对象?//复杂的 API 需要大量工作
- 使用具有某种 Gson 层次结构的多个 Gson?//丑陋且在存在循环依赖时无法工作
- 使用包装类?//只是丑陋但应该可以工作
最佳答案
更改List<Book> books
至List<BookSummary> books
,因为为单本书返回的对象与在书籍列表中返回的对象不同。
class BookSummary {
int id;
String name;
}
不等于
class BookDetail {
String name;
int pages;
String blurp;
List<Author> authors;
}
不需要(反)序列化器。
关于java - Gson:如何为链接对象编写反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61003895/