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