2012-04-03 112 views
39

我有可能會像JSON流:測試,如果它是的JSONObject或JSONArray

{"intervention": 

    { 
     "id":"3", 
       "subject":"dddd", 
       "details":"dddd", 
       "beginDate":"2012-03-08T00:00:00+01:00", 
       "endDate":"2012-03-18T00:00:00+01:00", 
       "campus": 
         { 
         "id":"2", 
         "name":"paris" 
         } 
    } 
} 

或類似

{"intervention": 
      [{ 
       "id":"1", 
       "subject":"android", 
       "details":"test", 
       "beginDate":"2012-03-26T00:00:00+02:00", 
       "endDate":"2012-04-09T00:00:00+02:00", 
       "campus":{ 
         "id":"1", 
         "name":"lille" 
         } 
      }, 

    { 
    "id":"2", 
      "subject":"lozlzozlo", 
      "details":"xxx", 
      "beginDate":"2012-03-14T00:00:00+01:00", 
      "endDate":"2012-03-18T00:00:00+01:00", 
      "campus":{ 
         "id":"1", 
         "name":"lille" 
         } 
      }] 
} 

在我的Java代碼中,我做到以下幾點:

JSONObject json = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream  
JSONArray interventionJsonArray = json.getJSONArray("intervention"); 

在第一情況下,上述不工作,因爲在流中只有一個元素是.. 如何檢查,如果流是objectarray

我試着用json.length(),但它沒有工作..

感謝

回答

89

像這樣的東西應該這樣做:

JSONObject json; 
Object  intervention; 
JSONArray interventionJsonArray; 
JSONObject interventionObject; 

json = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream  
Object intervention = json.get("intervention"); 
if (intervention instanceof JSONArray) { 
    // It's an array 
    interventionJsonArray = (JSONArray)intervention; 
} 
else if (intervention instanceof JSONObject) { 
    // It's an object 
    interventionObject = (JSONObject)intervention; 
} 
else { 
    // It's something else, like a string or number 
} 

這樣做的從主JSONObject只獲得一次房產價值的優勢。由於獲取屬性值涉及行走的哈希樹或相似,這對性能(它的價值)是有用的。

11

也許這樣的檢查?

JSONObject intervention = json.optJSONObject("intervention"); 

這會返回JSONObject,如果介入對象不是json對象,則返回null。這時旁邊做到這一點:

JSONArray interventions; 
if(intervention == null) 
     interventions=jsonObject.optJSONArray("intervention"); 

這將返回一個數組,如果其有效JSONArray否則會給null

+3

** **的Java,JavaScript不。 – 2012-04-03 06:44:01

+0

@ T.J.Crowder哇感謝,早上我想太早。編輯答案 – 2012-04-03 06:49:21

+0

好編輯,+1 ... – 2012-04-03 06:51:35

0

我沒有tryied,但也許......


JsonObject jRoot = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream 
JsonElement interventionElement = jRoot.get("intervention"); 
JsonArray interventionList = new JsonArray(); 

if(interventionElement.isJsonArray()) interventionList.addAll(interventionElement.getAsJsonArray()); 
else interventionList.add(interventionElement); 

如果它是一個JsonArray對象,只需使用getAsJsonArray()來強制轉換。如果不是,那麼只需添加它即可。

無論如何,你的第一爲例壞了,你應該問服務器的所有者進行修復。 JSON數據結構必須一致。這不僅僅是因爲有時干預只有一個元素,它不需要是一個數組。如果它只有1個元素,它將是一個只有1個元素的數組,但仍然必須是一個數組,以便客戶端可以使用始終相同的模式解析它。

7

爲簡單起見,你可以檢查來自服務器的結果第一個字符串。

String result = EntityUtils.toString(httpResponse.getEntity()); //this function produce JSON 
String firstChar = String.valueOf(result.charAt(0)); 

if (firstChar.equalsIgnoreCase("[")) { 
    //json array 
}else{ 
    //json object 
} 

這招正是基於JSON格式{foo : "bar"}(對象)的字符串 或[ {foo : "bar"}, {foo: "bar2"} ](陣列)

0
//returns boolean as true if it is JSONObject else returns boolean false 
public static boolean returnBooleanBasedOnJsonObject(Object jsonVal){ 
     boolean h = false; 
     try { 
      JSONObject j1=(JSONObject)jsonVal; 
      h=true; 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    if(e.toString().contains("org.json.simple.JSONArray cannot be cast to  org.json.simple.JSONObject")){ 
       h=false; 
      } 
     } 
     return h; 

    }