web-dev-qa-db-fra.com

Teste si c'est JSONObject ou JSONArray

J'ai un flux JSON qui peut être quelque chose comme:

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

ou quelque chose comme 

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

Dans mon code Java, je fais ce qui suit:

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

Dans le premier cas, ce qui précède ne fonctionne pas car il n'y a qu'un seul élément dans le flux… .. Comment vérifier si le flux est une object ou une array?

J'ai essayé avec json.length() mais ça n'a pas marché ..

Merci

46
Tang

Quelque chose comme ça devrait le faire:

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
}

Cela a l’avantage d’obtenir la valeur de la propriété de la variable principale JSONObject une seule fois. Comme obtenir la valeur de la propriété implique de marcher dans un arbre de hachage ou similaire, c'est utile pour la performance (pour ce que cela vaut).

106
T.J. Crowder

Peut-être un chèque comme ça?

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

Ceci renvoie JSONObject ou null si l'objet d'intervention n'est pas un objet JSON. Ensuite, faites ceci:

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

Cela vous retournera un tableau s'il s'agit d'une JSONArray valide, sinon ce sera null.

12
Nathan Q

Pour simplifier les choses, vous pouvez simplement vérifier la première chaîne du résultat du serveur.

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
}

Cette astuce est juste basée sur le format String du format JSON {foo : "bar"} (objet) Ou [ {foo : "bar"}, {foo: "bar2"} ] (tableau)

9
azwar_akbar
      Object valueObj = uiJSON.get(keyValue);
        if (valueObj instanceof JSONObject) {
            this.parseJSON((JSONObject) valueObj);
        } else if (valueObj instanceof JSONArray) {
            this.parseJSONArray((JSONArray) valueObj);
        } else if(keyValue.equalsIgnoreCase("type")) {
            this.addFlagKey((String) valueObj);
        }

// ITERATE JSONARRAY void privé parseJSONArray (JSONArray jsonArray) lève JSONException { for (Iterator iterator = jsonArray.iterator (); iterator.hasNext ();) { Objet JSONObject = (JSONObject) iterator.next (); this.parseJSON (objet); } }

2
Sagar Jadhav
    //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;

    }
0
haroon

Vous pouvez obtenir l'objet de la chaîne d'entrée en utilisant le code ci-dessous.

String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject)
 //do something for JSONObject
else if (json instanceof JSONArray)
 //do something for JSONArray

Lien: https://developer.Android.com/reference/org/json/JSONTokener#nextValue

0
Virendra Kachhi

Je ne l'ai pas essayé, mais peut-être ...


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

S'il s'agit d'un objet JsonArray, utilisez simplement getAsJsonArray () pour le lancer. Sinon, c'est un élément unique, ajoutez-le.

Quoi qu'il en soit, votre premier exemple est cassé, vous devriez demander au propriétaire du serveur de le réparer. Une structure de données JSON doit être cohérente. Ce n’est pas seulement parce qu’une intervention arrive avec un seul élément qu’elle n’a pas besoin d’être un tableau. S'il ne comporte qu'un seul élément, ce sera un tableau de 1 seul élément, mais ce doit toujours être un tableau, afin que les clients puissent l'analyser en utilisant toujours le même schéma.

0
user1930830