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