2011-04-06 62 views

回答

-3

嗯,我找到了一種方法,通過轉換過程獲得任意嵌套的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爲返回的數據,而不是一個替代方法做一個昂貴的轉換。

+0

你在開玩笑吧!?這是垃圾! – 2013-04-24 15:00:01

+0

從某種角度來看,一切都是真實的 - 它在當時是爲我服務的目的 – 2013-04-24 15:33:11

+0

真的很好:) – Renetik 2013-08-16 15:41:19

0

嗯,好像你可以擴展它,如果你需要的實現該接口。至於爲什麼,我懷疑它與以類型安全的方式持有異類數據無關,而無需做一堆醜陋的演員。

[更新]此對象也適用於基本類型,這些基元對通用映射接口不起作用。

+0

。我只寫了一個jsonToMap轉換器,但由於所有異常拋出都不會非常高效。就我個人而言,我認爲類型安全性被高估了。在第一個例子中,我只想把數據看作一個嵌套的Map和列表,指的是字符串...這是非常激烈的,我可能會嘗試擴展,但json非常簡單,很難相信那裏是不是一個簡單的原始jsonToMap轉換器那裏... – 2011-04-06 13:57:02

+0

「我認爲類型安全性被高估了」 - 你,我的朋友,會討厭Java :) – 2011-04-06 14:10:23

+0

我一直討厭約5的Java方面主要是因爲我開始使用Ruby/JavaScript進行編程等。在此之前的10年Java是「好的」,但我不知道我錯過了什麼:-) – 2011-04-06 14:33:50

5

我也很想知道爲什麼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; 
     } 
    } 
} 
相關問題