web-dev-qa-db-fra.com

Comment vérifier si l'objet donné est un objet ou un tableau dans une chaîne JSON

Je reçois une chaîne JSON du site Web. J'ai des données qui ressemblent à ceci (tableau JSON)

 myconf= {URL:[blah,blah]}

mais parfois, ces données peuvent être (objet JSON)

 myconf= {URL:{try}}

aussi peut être vide

 myconf= {}    

Je veux faire différentes opérations quand son objet et différent quand c'est un tableau. Jusqu'à présent, dans mon code, j'essayais de ne prendre en compte que les tableaux, de sorte que je reçois l'exception suivante. Mais je ne suis pas en mesure de vérifier les objets ou les tableaux.

Je reçois l'exception suivante

    org.json.JSONException: JSONObject["URL"] is not a JSONArray.

Quelqu'un peut-il suggérer comment cela peut être corrigé? Ici, je sais que les objets et les tableaux sont les instances de l’objet JSON. Mais je ne pouvais pas trouver une fonction avec laquelle je puisse vérifier si l'instance donnée est un tableau ou un objet.

J'ai essayé d'utiliser cette condition si mais sans succès

if ( myconf.length() == 0 ||myconf.has("URL")!=true||myconf.getJSONArray("URL").length()==0)
13
Judy

Les objets et les tableaux JSON sont des instances de JSONObject et JSONArray, respectivement. Ajoutez à cela le fait que JSONObject a une méthode get qui vous retournera un objet que vous pourrez vérifier le type de vous-même sans vous soucier de ClassCastExceptions, et le tour est joué.

if (!json.isNull("URL"))
{
    // Note, not `getJSONArray` or any of that.
    // This will give us whatever's at "URL", regardless of its type.
    Object item = json.get("URL"); 

    // `instanceof` tells us whether the object can be cast to a specific type
    if (item instanceof JSONArray)
    {
        // it's an array
        JSONArray urlArray = (JSONArray) item;
        // do all kinds of JSONArray'ish things with urlArray
    }
    else
    {
        // if you know it's either an array or an object, then it's an object
        JSONObject urlObject = (JSONObject) item;
        // do objecty stuff with urlObject
    }
}
else
{
    // URL is null/undefined
    // oh noes
}
30
cHao

Pas mal de façons.

Celui-ci est moins recommandé si vous êtes préoccupé par des problèmes de ressources système/une utilisation incorrecte des exceptions Java pour déterminer un tableau ou un objet.

try{
 // codes to get JSON object
} catch (JSONException e){
 // codes to get JSON array
}

Ou

Ceci est recommandé.

if (json instanceof Array) {
    // get JSON array
} else {
    // get JSON object
}
7
Oh Chin Boon

J'avais aussi le même problème. Bien que, j'ai résolu d'une manière facile.

Ma json était comme ci-dessous:

[{"id":5,"excerpt":"excerpt here"}, {"id":6,"excerpt":"another excerpt"}]

Parfois, j'ai une réponse comme:

{"id":7, "excerpt":"excerpt here"}

J'avais aussi une erreur comme toi. Tout d'abord, je devais être sûr qu'il s'agisse de JSONObject ou JSONArray.

Les tableaux JSON sont couverts par [] et les objets sont avec {}

Donc, j'ai ajouté ce code

if(response.startWith("[")){
  //JSON Array
}else{
  //JSON Object
}

Cela a fonctionné pour moi et je souhaite que ce soit aussi utile pour vous parce que c'est juste une méthode facile

1
AA Shakil

En utilisant @Chao answer, je peux résoudre mon problème. Sinon, nous pouvons également vérifier cela.

Ceci est ma réponse Json

{
  "message": "Club Details.",
  "data": {
    "main": [
      {
        "id": "47",
        "name": "Pizza",

      }
    ],

    "description": "description not found",
    "open_timings": "timings not found",
    "services": [
      {
        "id": "1",
        "name": "Free Parking",
        "icon": "http:\/\/hoppyclub.com\/uploads\/services\/ic_free_parking.png"
      } 
    ]
  }
}

Vous pouvez maintenant vérifier comme ceci quel objet est JSONObject ou JSONArray En réponse.

String response = "above is my reponse";

    if (response != null && constant.isJSONValid(response))
    {
        JSONObject jsonObject = new JSONObject(response);

        JSONObject dataJson = jsonObject.getJSONObject("data");

        Object description = dataJson.get("description");

        if (description instanceof String)
        {
            Log.e(TAG, "Description is JSONObject...........");
        }
        else
        {
            Log.e(TAG, "Description is JSONArray...........");
        }
    }

Ceci est utilisé pour vérifier que JSON reçu est valide ou non

public boolean isJSONValid(String test) {
        try {
            new JSONObject(test);
        } catch (JSONException ex) {
            // e.g. in case JSONArray is valid as well...
            try {
                new JSONArray(test);
            } catch (JSONException ex1) {
                return false;
            }
        }
        return true;
    }
0
Shailesh