在 Java 中將 JSONArray 轉換為 int 數組
1. 概述
在 Java 中處理 JSON 時,數字數組非常常見。 REST API 傳回 ID 列表,設定檔儲存數字標誌,測試負載也經常包含整數陣列。在很多情況下,我們接收到的資料是JSONArray類型的,但我們的業務邏輯期望的是普通的int[].這種差異看似微小,卻常常導致混淆、執行時錯誤或程式碼效率低。
在本教程中,我們將介紹在 Java 中將JSONArray轉換為int數組的實用且安全的方法。我們將以對話的形式進行講解,並結合實際應用場景,同時為每種方法編寫 JUnit 測試案例。我們將使用常用且易於理解的org.json庫。這些想法也適用於其他 JSON 函式庫,只是 API 上略有不同。
2. 理解核心問題
JSONArray不是 Java 陣列。它是一個包裝類型,內部以Object儲存值。即使 JSON 陣列看起來像[1, 2, 3] ,每個元素仍然以Object類型存取。因此,我們不能直接將JSONArray強制轉換為int[] 。如果嘗試這樣做,程式碼雖然可以編譯,但在運行時會拋出ClassCastException異常。這就是為什麼我們始終需要顯式轉換的原因。
讓我們從一個簡單的JSON陣列開始,我們要轉換這個陣列。我們的目標是將這個結構轉換成一個int[] ,以便在計算、循環或方法呼叫中安全使用。
3. 使用getInt()進行手動迭代
最直接、最易讀的方法是遍歷JSONArray並使用getInt()方法提取每個值。此方法已經執行類型檢查,如果值不是整數,則會拋出清晰的異常。我們還可以完全控制數組大小和索引:
@Test
void givenJsonArray_whenUsingLoop_thenIntArrayIsReturned() {
JSONArray jsonArray = new JSONArray("[1, 2, 3]");
int[] result = new int[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
result[i] = jsonArray.getInt(i);
}
assertArrayEquals(new int[]{1, 2, 3}, result);
}
這種方法易於調試,並且在正確性和清晰度比程式碼簡潔性更重要的情況下效果很好。它也能正確處理混合數值,只要這些數值可以表示為整數。
4. 將流與IntStream結合使用
當我們更傾向於函數式程式設計風格時,Java Stream 提供了一種簡潔的替代方案。由於JSONArray沒有直接暴露流,我們使用基於索引的串流傳輸,即IntStream.range() 。這樣既能保持程式碼簡潔,又能清楚說明轉換過程:
@Test
void givenJsonArray_whenUsingStreams_thenIntArrayIsReturned() {
JSONArray jsonArray = new JSONArray("[10, 20, 30]");
int[] result = IntStream.range(0, jsonArray.length()).map(jsonArray::getInt).toArray();
assertArrayEquals(new int[]{10, 20, 30}, result);
}
一旦熟悉了流的概念,這種方法就很容易理解。當周圍的程式碼已經大量使用流時,這種方法尤其有用。
5. 安全地處理空值和空數組
在實際應用中,我們經常會遇到可選欄位。有時JSONArray本身為null ,有時則為空。如果我們忽略這些情況,可能會在後續流程中出現NullPointerException異常或不明原因的錯誤。採用防禦性的轉換方法可以讓我們的程式碼更加健壯:
private int[] toIntArraySafely(JSONArray jsonArray) {
if (jsonArray == null || jsonArray.isEmpty()) {
return new int[0];
}
int[] result = new int[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
result[i] = jsonArray.getInt(i);
}
return result;
}
@Test
void givenNullJsonArray_whenConvertingSafely_thenEmptyArrayIsReturned() {
int[] result = toIntArraySafely(null);
assertEquals(0, result.length);
}
@Test
void givenEmptyJsonArray_whenConvertingSafely_thenEmptyArrayIsReturned() {
JSONArray jsonArray = new JSONArray();
int[] result = toIntArraySafely(jsonArray);
assertEquals(0, result.length);
}
透過傳回空數組,我們可以簡化呼叫程式碼,避免重複的空值檢查。這些測試確保能夠優雅地處理各種極端情況。
6. 結論
本文中我們看到,在 Java 中將JSONArray轉換為int[]並非簡單的型別轉換。關鍵在於理解 JSON 結構是通用容器,需要明確且安全地提取。透過手動迭代或使用流,我們可以獲得控制權、可讀性和正確性。新增防禦性檢查可以進一步增強程式碼在實際場景中的安全性。有了合適的 JUnit 測試,我們可以自信地重構或優化這些轉換,確保行為一致。
與往常一樣,本文中提供的程式碼可在 GitHub 上找到。