拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 从Java 中的URL 读取JSON

从Java 中的URL 读取JSON

白鹭 - 2022-08-22 2141 0 2

一、简介

在这个快速教程中,我们将创建能够从任何URL 读取JSON 数据的方法。我们将从核心Java 类开始。然后,我们将使用一些库来简化我们的代码。

2. 使用核心Java 类

在Java 中从URL 读取数据的最简单方法之一是使用URL类。要使用它,我们打开一个URL的输入流,创建一个输入流阅读器,然后读取所有字符。我们会将这些字符附加到StringBuilder中,然后将其作为String返回:

public static String stream(URL url) {
try (InputStream input = url.openStream()) {
InputStreamReader isr = new InputStreamReader(input);
BufferedReader reader = new BufferedReader(isr);
StringBuilder json = new StringBuilder();
int c;
while ((c = reader.read()) != -1) {
json.append((char) c);
}
return json.toString();
}
}

因此,代码包含很多样板文件。此外,如果我们想将JSON 转换为地图或POJO,还需要更多的代码。即使使用新的Java 11 HttpClient,对于一个简单的GET 请求也有很多代码。此外,将响应从字符串转换为POJO 也无济于事。所以,让我们探索更简单的方法来做到这一点。

3.使用commons-io和org.json

一个非常流行的库是Apache Commons IO。我们将使用IOUtils读取一个URL 并返回一个String。然后,要将其转换为JSONObject,我们将使用JSON-Java (org.json) 库。这是来自json.org的Java 参考实现。让我们将它们组合成一个新方法:

public static JSONObject getJson(URL url) {
String json = IOUtils.toString(url, Charset.forName("UTF-8"));
return new JSONObject(json);
}

使用JSONObject,我们可以为任何属性调用get()并获取一个Object。对于特定类型,有类似命名的方法。例如:

jsonObject.getString("stringProperty");

4. 使用Jackson 和ObjectMapper减少代码

有许多将JSON 转换为POJO 的解决方案,反之亦然。但是,Jackson 广泛用于Jersey 和其他JAX-RS 实现等项目。让我们在pom.xml中添加我们需要的依赖项:

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>

有了这个,我们不仅可以轻松地从URL 读取JSON,还可以同时将其转换为POJO。

4.1。反序列化为通用对象

Jackson 中的大部分动作都来自ObjectMapperObjectMapper最常见的场景是给它一个String输入并返回一个对象。幸运的是,ObjectMapper还可以直接从Internet URL 读取输入

public static JsonNode get(URL url) {
ObjectMapper mapper = new ObjectMapper();
return mapper.readTree(url);
}

使用readTree(),我们得到一个JsonNode,它是一个树状结构。我们使用它的get()方法读取属性:

json.get("propertyName");

因此,如果我们不想,我们不需要将我们的响应映射到特定的类。

4.2.反序列化为自定义类

但是,对于更复杂的对象,创建一个表示我们期望的JSON 结构的类会很有帮助。我们可以使用泛型创建我们的方法的一个版本,该版本能够使用readValue()将响应映射到我们想要的任何类

public static <T> T get(URL url, Class<T> type) {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(url, type);
}

然后,只要我们的对象的属性和结构匹配,我们就会得到一个新实例,其中填充了来自JSON 响应的值。

5. 结论

在本文中,我们学习了如何向URL 发出请求并返回JSON 字符串。然后,我们使用了一些库来简化我们的代码。最后,我们读取了一个JSON 响应,并在几行内将其映射到POJO。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *