2012-04-03 15 views
39

ist habe ich einen json Strom, wie etwas sein kann:Testen Sie, ob es JSONObject oder 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" 
         } 
    } 
} 

oder so etwas wie

{"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" 
         } 
      }] 
} 

In meinem Java-Code ich Folgendes tun:

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

Im ersten Fall funktioniert das Obige nicht, da nur ein Element im Stream vorhanden ist. Wie überprüfe ich, ob der Stream ein object oder ein array ist?

Ich habe versucht, mit json.length() aber es hat nicht funktioniert ..

Dank

Antwort

89

Etwas geben wie diese es tun sollten:

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 
} 

Dies hat die Vorteil des Erhaltens der Eigenschaft Wert von der Haupt JSONObject nur einmal. Da das Abrufen des Eigenschaftswerts einen Hash-Baum oder ähnliches enthält, ist das für die Leistung nützlich (für das, was es wert ist).

11

Vielleicht eine Prüfung wie diese?

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

Das gibt eine JSONObject oder null, wenn die Intervention Objekt kein json Objekt ist. Dann ist dieses als nächstes tun:

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

Dadurch kehren Sie ein Array, wenn es ein gültiges JSONArray sonst wird es null

+3

** Java **, nicht JavaScript. –

+0

@ T.J.Crowder wow danke, zu früh am Morgen schätze ich. bearbeitete Antwort –

+0

Gut bearbeiten, +1 ... –

0

Ich habe tryied es nicht, aber vielleicht ...


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

Wenn es ein JsonArray Objekt ist, benutzen Sie einfach getAsJsonArray() es zu werfen. Wenn nicht, ist es ein einzelnes Element, also fügen Sie es einfach hinzu.

Wie auch immer, Ihr erstes Exemplar ist kaputt, Sie sollten den Serverbesitzer bitten, es zu beheben. Eine JSON-Datenstruktur muss konsistent sein. Es ist nicht nur, weil Intervention manchmal mit nur einem Element kommt, dass es kein Array sein muss. Wenn es nur 1 Element hat, ist es ein Array von nur 1 Element, muss aber immer noch ein Array sein, so dass Clients es unter Verwendung immer des gleichen Schemas analysieren können.

7

Um es einfach zu machen, können Sie einfach die erste Zeichenfolge vom Server-Ergebnis überprüfen.

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 
} 

Dieser Trick ist auf String von JSON-Format {foo : "bar"} (Objekt) nur basierend oder [ {foo : "bar"}, {foo: "bar2"} ] (Array)

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; 

    } 
Verwandte Themen