它似乎很奇怪的是,Android的org.json *不實現Map接口:爲什麼Android org.json。*不實現Map接口?
http://developer.android.com/reference/org/json/JSONObject.html
有人知道爲什麼嗎?想一個簡單的方法來解決這個問題,或者當我們碰巧使用JSON時,我們是否採用了導航一系列嵌套地圖的特定單獨方式?
提前 CHEERS非常感謝> SAM
它似乎很奇怪的是,Android的org.json *不實現Map接口:爲什麼Android org.json。*不實現Map接口?
http://developer.android.com/reference/org/json/JSONObject.html
有人知道爲什麼嗎?想一個簡單的方法來解決這個問題,或者當我們碰巧使用JSON時,我們是否採用了導航一系列嵌套地圖的特定單獨方式?
提前 CHEERS非常感謝> SAM
嗯,我找到了一種方法,通過轉換過程獲得任意嵌套的List/Map對象。也許非常低效的,因爲它依賴於多個JSONExceptions,但做什麼,我需要:
private static Map<String, Object> jsonObjectToMap(JSONObject object) {
@SuppressWarnings("unchecked")
Iterator<String> keys = object.keys();
String key;
Map<String, Object> map = new HashMap<String, Object>();
while (keys.hasNext()) {
key = keys.next();
try {
map.put(key, jsonObjectToMap(object.getJSONObject(key)));
} catch (JSONException e) {
try {
map.put(key, jsonArrayToList(object.getJSONArray(key)));
} catch (JSONException e1) {
try {
map.put(key, object.getString(key));
} catch (JSONException e2) {
try {
map.put(key, object.getInt(key));
} catch (JSONException e3) {
try {
map.put(key, object.getLong(key));
} catch (JSONException e4) {
try {
map.put(key, object.getBoolean(key));
} catch (JSONException e5) {
try {
map.put(key, object.getDouble(key));
} catch (JSONException e6) {
try {
map.put(key, object.get(key));
} catch (JSONException e7) {
// TODO Auto-generated catch block
e7.printStackTrace();
}
}
}
}
}
}
}
}
}
return map;
}
private static List<Object> jsonArrayToList(JSONArray array) {
List<Object> arrayList = new ArrayList<Object>();
for (int i = 0; i < array.length(); i++) {
try {
arrayList.add(jsonObjectToMap(array.getJSONObject(i)));
} catch (JSONException e) {
try {
arrayList.add(jsonArrayToList(array.getJSONArray(i)));
} catch (JSONException e1) {
try {
arrayList.add(array.getString(i));
} catch (JSONException e2) {
try {
arrayList.add(array.getInt(i));
} catch (JSONException e3) {
try {
arrayList.add(array.getLong(i));
} catch (JSONException e4) {
try {
arrayList.add(array.getBoolean(i));
} catch (JSONException e5) {
try {
arrayList.add(array.getDouble(i));
} catch (JSONException e6) {
try {
arrayList.add(array.get(i));
} catch (JSONException e7) {
// TODO Auto-generated catch block
e7.printStackTrace();
}
}
}
}
}
}
}
}
}
return arrayList;
}
將是巨大的,如果這種支持可以內置於json.org爲返回的數據,而不是一個替代方法做一個昂貴的轉換。
嗯,好像你可以擴展它,如果你需要的實現該接口。至於爲什麼,我懷疑它與以類型安全的方式持有異類數據無關,而無需做一堆醜陋的演員。
[更新]此對象也適用於基本類型,這些基元對通用映射接口不起作用。
。我只寫了一個jsonToMap轉換器,但由於所有異常拋出都不會非常高效。就我個人而言,我認爲類型安全性被高估了。在第一個例子中,我只想把數據看作一個嵌套的Map和列表,指的是字符串...這是非常激烈的,我可能會嘗試擴展,但json非常簡單,很難相信那裏是不是一個簡單的原始jsonToMap轉換器那裏... – 2011-04-06 13:57:02
「我認爲類型安全性被高估了」 - 你,我的朋友,會討厭Java :) – 2011-04-06 14:10:23
我一直討厭約5的Java方面主要是因爲我開始使用Ruby/JavaScript進行編程等。在此之前的10年Java是「好的」,但我不知道我錯過了什麼:-) – 2011-04-06 14:33:50
我也很想知道爲什麼Android的JSON庫沒有實現標準接口......但無論如何,這裏的類型轉換自己的一種方式:延長它看起來痛苦
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.*;
public class JsonHelper {
public static Map<String, Object> toMap(JSONObject object) throws JSONException {
Map<String, Object> map = new HashMap();
Iterator keys = object.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
map.put(key, fromJson(object.get(key)));
}
return map;
}
public static List toList(JSONArray array) throws JSONException {
List list = new ArrayList();
for (int i = 0; i < array.length(); i++) {
list.add(fromJson(array.get(i)));
}
return list;
}
private static Object fromJson(Object json) throws JSONException {
if (json instanceof JSONObject) {
return toMap((JSONObject) json);
} else if (json instanceof JSONArray) {
return toList((JSONArray) json);
} else {
return json;
}
}
}
你在開玩笑吧!?這是垃圾! – 2013-04-24 15:00:01
從某種角度來看,一切都是真實的 - 它在當時是爲我服務的目的 – 2013-04-24 15:33:11
真的很好:) – Renetik 2013-08-16 15:41:19