1. 簡介
本教程將探討幾種遍歷 JSONObject 的方法。JSONObject 是一種簡單的 JSON 表示形式,用於 Java。
我們將首先介紹一種簡單的解決方案,然後探討一種更健壯的方法。
2. 遍歷一個 JSONObject
讓我們從遍歷鍵值對的簡單情況開始:
{
"name": "Cake",
"cakeId": "0001",
"cakeShape": "Heart"
}對於這一點,我們可以簡單地通過使用<em>keys()</em>方法迭代鍵:
void handleJSONObject(JSONObject jsonObject) {
jsonObject.keys().forEachRemaining(key -> {
Object value = jsonObject.get(key);
logger.info("Key: {0}\tValue: {1}", key, value);
}
}以及我們的輸出將是:
Key: name Value: Cake
Key: cakeId Value: 0001
Key: cakeShape Value: Heart3. 遍歷一個 JSONObject
假設我們有一個更復雜的結構:
{
"batters": [
{
"type": "Regular",
"id": "1001"
},
{
"type": "Chocolate",
"id": "1002"
},
{
"type": "BlueBerry",
"id": "1003"
}
],
"name": "Cake",
"cakeId": "0001"
}迭代遍歷鍵意味着什麼在這種情況下?
讓我們看看我們的樸素的 keys() 方法會給我們什麼結果:
Key: batters Value: [{"type":"Regular","id":"1001"},{"type":"Chocolate","id":"1002"},
{"type":"BlueBerry","id":"1003"}]
Key: name Value: Cake
Key: cakeId Value: 0001這或許不太管用。我們似乎想要的是遍歷,而不是迭代。
遍歷一個 JSONObject 與遍歷 JSONObject 的鍵集是不同的。
為此,我們實際上還需要檢查值類型。 讓我們假設我們這樣做在一個單獨的方法中:
void handleValue(Object value) {
if (value instanceof JSONObject) {
handleJSONObject((JSONObject) value);
} else if (value instanceof JSONArray) {
handleJSONArray((JSONArray) value);
} else {
logger.info("Value: {0}", value);
}
}然後,我們的方法仍然相當相似:
void handleJSONObject(JSONObject jsonObject) {
jsonObject.keys().forEachRemaining(key -> {
Object value = jsonObject.get(key);
logger.info("Key: {0}", key);
handleValue(value);
});
}唯一需要考慮的是如何處理數組。
4. 遍歷JSONArray
讓我們採用類似的方式,使用迭代器。然而,我們不再調用keys(),而是調用iterator()。
void handleJSONArray(JSONArray jsonArray) {
jsonArray.iterator().forEachRemaining(element -> {
handleValue(element)
});
}現在,這個解決方案是有侷限性的,因為我們同時使用了遍歷和想要執行的操作。 採用一種常見的方法來分離這兩個操作是使用訪問者模式。
5. 結論
在本文中,我們瞭解到一種遍歷 JSONObject 的方法,用於處理簡單的鍵值對,並探討了複雜結構帶來的問題,以及一種用於解決這些問題的遍歷技術。
當然,這是一種深度優先遍歷方法,但我們可以類似地使用廣度優先遍歷。