Je vais recevoir un objet JSON ou un tableau du serveur, mais je ne sais pas du tout. Je dois travailler avec le JSON, mais pour ce faire, je dois savoir s'il s'agit d'un objet ou d'un tableau.
Je travaille avec Android.
Est-ce que quelqu'un a un bon moyen de faire cela?
J'ai trouvé un meilleur moyen de déterminer:
String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject)
//you have an object
else if (json instanceof JSONArray)
//you have an array
tokenizer est capable de renvoyer plusieurs types: http://developer.Android.com/reference/org/json/JSONTokener.html#nextValue ()
Vous pouvez le faire de différentes manières:
{
, vous avez affaire à un JSONObject
, s’il s’agit d’un [
, vous avez affaire à un JSONArray
.Object
), vous pouvez alors effectuer un contrôle instanceof
. yourObject instanceof JSONObject
. Cela retournera true si votre objet est un objet JSON. La même chose s'applique à JSONArray.Voici la solution simple que j'utilise sur Android:
JSONObject json = new JSONObject(jsonString);
if (json.has("data")) {
JSONObject dataObject = json.optJSONObject("data");
if (dataObject != null) {
//Do things with object.
} else {
JSONArray array = json.optJSONArray("data");
//Do things with array
}
} else {
// Do nothing or throw exception if "data" is a mandatory field
}
Présenter une autre manière:
if(server_response.trim().charAt(0) == '[') {
Log.e("Response is : " , "JSONArray");
} else if(server_response.trim().charAt(0) == '{') {
Log.e("Response is : " , "JSONObject");
}
Ici server_response
est une chaîne de réponse provenant du serveur
Une façon plus fondamentale de procéder est la suivante.
JsonArray
est par nature un Liste
JsonObject
est par nature un Carte
if (object instanceof Map){
JSONObject jsonObject = new JSONObject();
jsonObject.putAll((Map)object);
...
...
}
else if (object instanceof List){
JSONArray jsonArray = new JSONArray();
jsonArray.addAll((List)object);
...
...
}
Mon approche serait une abstraction totale de cela. Peut-être que quelqu'un trouve cela utile ...
import Java.lang.reflect.Field;
import Java.util.ArrayList;
import Java.util.Collection;
import Java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class SimpleJSONObject extends JSONObject {
private static final String FIELDNAME_NAME_VALUE_PAIRS = "nameValuePairs";
public SimpleJSONObject(String string) throws JSONException {
super(string);
}
public SimpleJSONObject(JSONObject jsonObject) throws JSONException {
super(jsonObject.toString());
}
@Override
public JSONObject getJSONObject(String name) throws JSONException {
final JSONObject jsonObject = super.getJSONObject(name);
return new SimpleJSONObject(jsonObject.toString());
}
@Override
public JSONArray getJSONArray(String name) throws JSONException {
JSONArray jsonArray = null;
try {
final Map<String, Object> map = this.getKeyValueMap();
final Object value = map.get(name);
jsonArray = this.evaluateJSONArray(name, value);
} catch (Exception e) {
throw new RuntimeException(e);
}
return jsonArray;
}
private JSONArray evaluateJSONArray(String name, final Object value) throws JSONException {
JSONArray jsonArray = null;
if (value instanceof JSONArray) {
jsonArray = this.castToJSONArray(value);
} else if (value instanceof JSONObject) {
jsonArray = this.createCollectionWithOneElement(value);
} else {
jsonArray = super.getJSONArray(name);
}
return jsonArray;
}
private JSONArray createCollectionWithOneElement(final Object value) {
final Collection<Object> collection = new ArrayList<Object>();
collection.add(value);
return (JSONArray) new JSONArray(collection);
}
private JSONArray castToJSONArray(final Object value) {
return (JSONArray) value;
}
private Map<String, Object> getKeyValueMap() throws NoSuchFieldException, IllegalAccessException {
final Field declaredField = JSONObject.class.getDeclaredField(FIELDNAME_NAME_VALUE_PAIRS);
declaredField.setAccessible(true);
@SuppressWarnings("unchecked")
final Map<String, Object> map = (Map<String, Object>) declaredField.get(this);
return map;
}
}
Et maintenant, débarrassez-vous de ce comportement pour toujours ...
...
JSONObject simpleJSONObject = new SimpleJSONObject(jsonObject);
...
Pour ceux qui s’occupent de ce problème en JavaScript, les éléments suivants ont fait le travail pour moi (je ne suis pas sûr de son efficacité).
if(object.length != undefined) {
console.log('Array found. Length is : ' + object.length);
} else {
console.log('Object found.');
}
exemple de
Object.getClass (). GetName ()