Java 如何从这样的JSON返回列表?
我正在使用巨型炸弹API制作一个网络应用程序 我被卡住了,因为我需要使用Unirest从get请求中获取一个搜索结果列表,然后方便地将其转换为一个名为“建议”的对象列表 我的问题是: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;
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
}