1 回答
TA贡献1765条经验 获得超5个赞
正如我在评论中提到的,如果您使用一个库或框架来为您完成繁重的工作,这将非常容易。这是一个使用Jersey检索列表的非常简单的示例。
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class ListExtractor {
public static void main(String[] args) {
Client restClient = ClientBuilder.newClient();
Response response = restClient.target("https://api.myjson.com/bins/7xq2x").request(MediaType.APPLICATION_JSON).get();
List<Item> items = response.readEntity(new GenericType<List<Item>>() {});
items.forEach(System.out::println);
}
static class Item {
private String name;
private String abbreviation;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAbbreviation() {
return abbreviation;
}
public void setAbbreviation(String abbreviation) {
this.abbreviation = abbreviation;
}
@Override
public String toString() {
return new StringBuilder().append("[name=").append(name).append(", abbreviation=").append(abbreviation).append("]")
.toString();
}
}
}
更新
我只是稍微修改了代码,以便它返回一个项目列表。
警告:这不是生产就绪代码。我没有添加任何异常处理或日志记录,因此它保持简短并以清晰的方式传达其目的。
您需要熟悉 JSON 序列化器/反序列化器,才能理解上面示例中的内容。
解释
如果您查看链接 ( https://api.myjson.com/bins/7xq2x ) 的响应,您会看到它返回一个 JSON 数组,其中数组的每个元素是: {"name":"Alberta","abbreviation":"AB"}
。Jersey 提供的 JSON 反序列化器可以将此 JSON 对象转换(反序列化)为 Java 对象,如果您有一个类,该类具有两个名为name
and abbreviation
(及其相应的 getter 和 setter)的字段。
这行代码
response.readEntity(new GenericType<List<Item>>() {});
将开箱即用,因为我们为Item
类提供了与上面 JSON 对象中的键一样命名的字段:
class Item {
private String name;
private String abbreviation;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAbbreviation() {
return abbreviation;
}
public void setAbbreviation(String abbreviation) {
this.abbreviation = abbreviation;
}
@Override
public String toString() {
return new StringBuilder().append("[name=").append(name).append(", abbreviation=").append(abbreviation).append("]")
.toString();
}
}
这是修改后的示例:
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class ListExtractor {
public static void main(String[] args) {
List<Item> items = getItems();
items.forEach(System.out::println);
}
static List<Item> getItems() {
Client restClient = ClientBuilder.newClient();
Response response = restClient.target("https://api.myjson.com/bins/7xq2x").request(MediaType.APPLICATION_JSON).get();
return response.readEntity(new GenericType<List<Item>>() {});
}
static class Item {
private String name;
private String abbreviation;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAbbreviation() {
return abbreviation;
}
public void setAbbreviation(String abbreviation) {
this.abbreviation = abbreviation;
}
@Override
public String toString() {
return new StringBuilder().append("[name=").append(name).append(", abbreviation=").append(abbreviation).append("]")
.toString();
}
}
}
泽西依赖项(Gradle):
implementation 'org.glassfish.jersey.core:jersey-client:2.25.1'
implementation 'org.glassfish.jersey.media:jersey-media-json-jackson:2.25.1'
implementation 'org.glassfish.jersey.media:jersey-media-jaxb:2.25.1'
添加回答
举报