web-dev-qa-db-fra.com

Déterminer si JSON est un JSONObject ou un JSONArray

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?

119
Greg

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

229
neworld

Vous pouvez le faire de différentes manières:

  1. Vous pouvez vérifier le caractère à la première position de la chaîne (après avoir coupé les espaces, comme le permet JSON valide). Si c'est un {, vous avez affaire à un JSONObject, s’il s’agit d’un [, vous avez affaire à un JSONArray.
  2. Si vous utilisez JSON (un 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.
52

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
}
12
sourcerebels

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

5
Bhargav Thanki

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);
    ...
    ...
}
1
Pankaj Singhal

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);
...
1
oopexpert

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.'); 
}
0
Raf

exemple de

Object.getClass (). GetName ()

0
Hot Licks