web-dev-qa-db-ja.com

JSONがJSONObjectかJSONArrayかを判断する

サーバーからJSONオブジェクトまたは配列のいずれかを受信しますが、どちらになるかわかりません。 JSONで作業する必要がありますが、そのためには、JSONがオブジェクトか配列かを知る必要があります。

Androidを使用しています。

これを行う良い方法はありますか?

119
Greg

私は決定するより良い方法を見つけました:

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はより多くの型を返すことができます: http://developer.Android.com/reference/org/json/JSONTokener.html#nextValue ()

229
neworld

これを行うには、いくつかの方法があります。

  1. 文字列の最初の位置の文字を確認できます(有効なJSONで許可されているように、空白を削除した後)。 {である場合、JSONObjectを処理しています。[である場合、JSONArrayを処理しています。
  2. JSON(Object)を処理している場合は、instanceofチェックを実行できます。 yourObject instanceof JSONObject。 yourObjectがJSONObjectの場合、これはtrueを返します。同じことがJSONArrayにも当てはまります。
52

これは私が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

別の方法を提示する:

if(server_response.trim().charAt(0) == '[') {
    Log.e("Response is : " , "JSONArray");
} else if(server_response.trim().charAt(0) == '{') {
    Log.e("Response is : " , "JSONObject");
}

ここでserver_responseはサーバーからの応答文字列です

5
Bhargav Thanki

これを行うためのより基本的な方法は次のとおりです。

JsonArrayは本質的に リスト

JsonObjectは本質的に Map

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

私のアプローチは、これからの完全な抽象化です。たぶん誰かがこれを便利だと思う...

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


}

そして今、この振る舞いを永遠に取り除きます...

...
JSONObject simpleJSONObject = new SimpleJSONObject(jsonObject);
...
1
oopexpert

JavaScriptでこの問題に取り組んでいる人のために、次のことが私に役立った(どれだけ効率的かはわからない)。

if(object.length != undefined) {
   console.log('Array found. Length is : ' + object.length); 
} else {
 console.log('Object found.'); 
}
0
Raf

instanceof

Object.getClass()。getName()

0
Hot Licks