從 Java 中的 URL 讀取 JSON
一、簡介
在這個快速教程中,我們將創建能夠從任何 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
還可以直接從 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。
與往常一樣,源代碼可在 GitHub 上獲得。