testing它是否是JSONObject或JSONArray

我有一个JSONstream,可以是这样的:

{"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"); 

在第一种情况下,以上不起作用,因为在stream中只有一个元素。如何检查stream是一个object还是array

我试着用json.length()但它没有工作..

谢谢

像这样的东西应该这样做:

 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获取属性值的优点。 由于获取属性值涉及散列树或类似的,这对于性能(对于它的价值)是有用的。

也许这样的支票?

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

这将返回一个JSONObject ,如果干预对象不是json对象,则返回null。 接下来做这个:

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

这将返回一个数组,如果它有一个有效的JSONArray或否则它会给null

为了简单起见,您可以从服务器结果中检查第一个string。

 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格式的string{foo : "bar"} (object)或者[ {foo : "bar"}, {foo: "bar2"} ] (array)

我没有尝试过,但也许…

 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数据结构必须一致。 这不仅仅是因为有时干预只有一个元素,它不需要是一个数组。 如果它只有一个元素,它将是一个只有一个元素的数组,但仍然必须是一个数组,以便客户端可以使用总是相同的模式parsing它。

  //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; }