141 votes

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, j'ai besoin de 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 ça? Je n'arrive pas à comprendre, ça devrait être assez facile.

Merci

261voto

neworld Points 2646

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

55voto

nicholas.hauschild Points 21796

Il existe quelques façons dont vous pouvez faire ceci:

  1. Vous pouvez vérifier le caractère à la première position de la Chaîne. Si c'est un {, vous avez affaire à un JSONObject, si c'est un [, vous avez affaire à un JSONArray.
  2. Si vous êtes aux prises avec JSON ( Object), alors vous pouvez faire un instanceof vérifier. yourObject instanceof JSONObject. Cela renvoie true si yourObject est un JSONObject. La même chose s'applique à JSONArray.

0voto

Hot Licks Points 25075

exemple de

Object.getClass (). GetName ()

-1voto

oopexpert Points 16

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X