java - Gson:如何为链接对象编写反序列化器

标签 java json gson

想象一下图书库的以下 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> booksList<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/

相关文章:

php - 查询应返回整数和字符串 CI

java - 在 GWT 客户端代码中使用 Gson 库

java - java持久化中注解映射是如何完成的?

java - 哪个选项更好地获取执行方法的方法名称

java - hibernate/ Spring 3 : could not initialize proxy - no Session

java - 当进入另一个扫描二维码的 Activity 时,唐停了下来

python - 如何迭代文件并将所有 id 值放入列表中 [Python]

javascript - ReactJS(初学者)使用 Youtube API - 返回的对象不允许我访问 VideoId 属性

kotlin - 使用 Klaxon 使用动态键解析 map

android - Gson 在 > 4.0 设备上抛出异常