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