我如何从 JSON 中 return 列表 <Object>?

How do I return a List<Object> from a JSON like this?

我正在使用 Giant Bomb API 制作一个网络应用程序 API。

我被卡住了,因为我需要从 GET 请求(使用 Unirest)获取搜索结果列表,然后方便地将其转换为称为建议的 Object 列表。

这是我的问题所在:

private List<Suggestion> suggestions = new ArrayList<>();

public List<Suggestion> searchGames(){

    HttpResponse<String> request;
    try {
    request = Unirest.get("http://giantbomb.com/api/search/?api_key=xxxxxxxxxxxxxxxxxxxxxxxxx&format=json&resources=game&limit=10&field_list=name&query=creed")
                .header("Accept", "application/json")
                .asString();

    String requestString = request.toString(); //I can get my request as String, but that doesnt change much, I guess

    //>>> the problematic part <<<

    return suggestions;
}

我遗漏了一些可以让我将 JSON 响应从 Unirest 转换为列表的东西。这是我尝试过的:

我的 JSON 来自 Unirest 的电话看起来很像这样:

 {
        "error": "OK",
        "limit": 10,
        "offset": 0,
        "number_of_page_results": 1,
        "number_of_total_results": 3,
        "status_code": 1,
        "results": [
            {
                "name": "Assassin's Creed",
                "resource_type": "game"
            },
            {
                "name": "The Creed",
                "resource_type": "game"
            },
            {
                "name": "Assassin's Creed: Lost Legacy",
                "resource_type": "game"
            }
        ]
}

我有一个类似的游戏 class 解决方案,我在其中显示名为游戏的列表。

private List<Game> games = new ArrayList<>();

public List<Game> getAllGames(){
    return games;
}

我使用输入 ID 和标题的 GET 请求填充此列表。

来自 Giant Bomb API 的建议对我来说比较棘手,因为我使用外部 API 来获取 objects 的列表,而不是输入我的输入数据。

我的 Suggestion.java class 看起来像这样:

package rest.library;


public class Suggestion {

    private long id;
    private String name;

    public Suggestion(){
    }

    public Suggestion(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

}

在我的控制器中,我想这样做:

@RequestMapping("/search")
public List<Suggestion> searchGames() { return gameService.searchGames(); }

在 localhost:8080/search 下应该 return 一个 Object 的列表,其中包含从 JSON 请求中获得的搜索结果。它应该看起来像 localhost:8080/games,return 是我在 Postman 上使用 GET 发送的游戏列表。我知道我从 API 得到字段 "resource_type" 并且没有 "id" 字段,但这是以后的问题,因为我认为填充选定的 class 字段并添加 id渐进式不会有太大问题。

你需要的是一种将你从请求中收到的String对象映射到HashMap的方法,这样你就可以设置你的对象属性,并形成一个列表return(即使有像 Jackson 这样的 API 使得实现 REST 请求处理逻辑变得不那么痛苦)。

这意味着首先使用 response.getEntity().getContent() 从 HTTP 请求中获取 InputStream,然后创建一个 JSONParser,如 here 所述。

这将使您能够从 JSON 字符串中获取属性,如 here 所示。

反过来,这将使您能够使用 setter 方法来创建您自己的对象列表。

让我知道是否有帮助。

我推荐使用 http-request 构建在 apache http api 上。您可以创建 class 响应数据来解析响应。

 private static final HttpRequest<ResponseData> HTTP_REQUEST = 
        HttpRequestBuilder.createGet("http://giantbomb.com/api/search", ResponseData.class)
        .addDefaultHeader("Accept", "application/json")
        .addDefaultRequestParameter("api_key", "xxxxxxxxxxxxxxxxxxxxxxxxx")
        .addDefaultRequestParameter("format", "json")
        .addDefaultRequestParameter("resources", "game")
        .addDefaultRequestParameter("limit", "10")
        .addDefaultRequestParameter("field_list", "name")
        .addDefaultRequestParameter("query", "creed")
        .build();

  List<Suggestion> searchGames() {
      ResponseHandler<ResponseData> responseHandler = HTTP_REQUEST.execute();
      ResponseData responseData = responseHandler.get();

      // Here create the List<Suggestion> from responseData   

      return suggestions
  }

private class ResponseData{
    private String error;
    private int limit;
    private int offset;
    private int number_of_page_results;
    private int number_of_total_results;
    private int status_code;
    private List<Result> results;

    //getters and setters
}

private class Result{
    private String name;
    private String resource_type;

    //getters and setters
}