我如何从 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 转换为列表的东西。这是我尝试过的:
- GSON - JSON 格式有问题(JSON 开头有一些数据,因为字段有 Limit、Offset 等)
- Object Mapper (Unirest/Jackson) - 因为我得到的是 httpResponse 而不是 String/Object/JsonNode 等问题
- 使用 JSONObject、JSON数组和 for 循环 - 也不走运。
我的 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
}
我正在使用 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 转换为列表的东西。这是我尝试过的:
- GSON - JSON 格式有问题(JSON 开头有一些数据,因为字段有 Limit、Offset 等)
- Object Mapper (Unirest/Jackson) - 因为我得到的是 httpResponse 而不是 String/Object/JsonNode 等问题
- 使用 JSONObject、JSON数组和 for 循环 - 也不走运。
我的 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
}