Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从这样的JSON返回列表?_Java_Json_Spring_Unirest - Fatal编程技术网

Java 如何从这样的JSON返回列表?

Java 如何从这样的JSON返回列表?,java,json,spring,unirest,Java,Json,Spring,Unirest,我正在使用巨型炸弹API制作一个网络应用程序 我被卡住了,因为我需要使用Unirest从get请求中获取一个搜索结果列表,然后方便地将其转换为一个名为“建议”的对象列表 我的问题是: private List<Suggestion> suggestions = new ArrayList<>(); public List<Suggestion> searchGames(){ HttpResponse<String> request;

我正在使用巨型炸弹API制作一个网络应用程序

我被卡住了,因为我需要使用Unirest从get请求中获取一个搜索结果列表,然后方便地将其转换为一个名为“建议”的对象列表

我的问题是:

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;
}
我有一个类似于Game类的解决方案,我在其中显示名为games的列表

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

public List<Game> getAllGames(){
    return games;
}
在我的控制器中,我要执行以下操作:

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

在localhost:8080/search下,应该返回一个对象列表,其中包含从JSON请求中获得的搜索结果。它应该看起来像localhost:8080/games,它返回我使用GET-on-Postman发送的游戏列表。我知道我从API中获取了字段资源类型,没有id字段,但这对以后来说是个问题,因为我认为填充选定的类字段和增量添加id不会有太大问题。

您需要的是一种将从请求中收到的字符串对象映射到HashMap的方法,这样,您就可以设置对象属性,并形成一个要返回的列表,即使有像Jackson这样的API,这使得实现REST请求处理逻辑的痛苦要小得多

这意味着首先使用response.getEntity.getContent从HTTP请求获取InputStream,然后创建前面提到的JSONParser

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

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

让我知道这是否有帮助。

我建议使用基于apache http api构建的。您可以创建类ResponseData来解析响应

 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
}

这是针对ArrayList的,我遇到了不兼容类型的错误,我不知道如何将请求httpResponse转换为,例如,JSONArray.string转换为JSONArray JSONObject myObject=new JSONObject result;这太好了,我会尽快调查的。和杰克逊在一起有多容易?我是说,我试过了,但也遇到了麻烦。我在工作场所使用Jackson,一旦设置好,就很容易了。您可以使用@GET注释、@PathPATH\u此处注释创建一个资源方法,并向该方法添加任何类型的参数,这些参数表示方法体和/或路径接受的内容。这应该足以自动将JSON请求主体转换为指定的POJO。为什么request.getEntity.getContent通知我getEntity无法解析?如果没有看到您当前的代码,我不确定。用您当前的代码创建另一个问题,我会看看是否能解决。我遇到的问题也与我的JSON响应有关,如果有10个以上的结果,我的响应中没有包含{}括号。我使用了一个不同的外部API和一个更方便的JSON响应,然后通过Jackson进行映射,效果非常好。
@RequestMapping("/search")
public List<Suggestion> searchGames() { return gameService.searchGames(); }
 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
}