1. 引言
在本快速教程中,我們將學習如何創建能夠從任何 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 中的大部分功能都來自 ObjectMapper。ObjectMapper 最常見的用法是接收一個 String 作為輸入,並返回一個對象。 幸運的是,ObjectMapper 還可以直接從互聯網 URL 讀取輸入:
public static JsonNode get(URL url) {
ObjectMapper mapper = new ObjectMapper();
return mapper.readTree(url);
}使用 readTree() 方法,我們得到一個 JsonNode,它是一個樹狀結構。我們使用它的 get() 方法讀取屬性:
json.get("propertyName");因此,如果我們不希望將我們的響應映射到特定的類,我們就不需要這樣做。
4.2. 將 JSON 序列化到自定義類
對於更復雜的對象,創建一個代表我們期望的 JSON 結構類的做法很有幫助。我們可以使用泛型來創建一個方法版本,該方法版本能夠將響應映射到任何我們想要定義的類,利用 <em>readValue()</em></strong> 方法:
public static <T> T get(URL url, Class<T> type) {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(url, type);
}然後,只要我們的對象的屬性和結構與 JSON 響應匹配,我們就會獲得一個新實例,該實例將填充來自 JSON 響應的值。
5. 結論
在本文中,我們學習瞭如何向 URL 發出請求並獲取 JSON 字符串。然後,我們使用了一些庫來簡化我們的代碼。 最終,我們通過解析 JSON 響應並將其映射到 POJO,只需幾行代碼。