निर्धारित करें कि क्या JSON एक JSONObject या JSONArray है


132

मैं या तो JSON ऑब्जेक्ट या सर्वर से Array प्राप्त करने जा रहा हूं, लेकिन मुझे नहीं पता कि यह कौन सा होगा। मुझे JSON के साथ काम करने की आवश्यकता है, लेकिन ऐसा करने के लिए, मुझे यह जानना होगा कि क्या यह एक वस्तु या एक सरणी है।

मैं एंड्रॉइड के साथ काम कर रहा हूं।

क्या किसी के पास ऐसा करने का अच्छा तरीका है?


अगर एंड्रॉइड के साथ ग्सन का उपयोग किया जाता है और जब यह करने का एक तरीका डिस्क्राइनल करना आता है तो यह इस तरह है ।
पिरहो

जवाबों:


244

मुझे निर्धारित करने का बेहतर तरीका मिला:

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

टोकनधारक अधिक प्रकारों को वापस करने में सक्षम है: http://developer.android.com/reference/org/json/JSONTokener.html#nextValue ()


1
अच्छी नौकरी। आशा है कि यह JsonObject और Json Array
Shreyash Mahajan

2
@neworld लेकिन क्या होगा अगर मैं एक लूप के बीच में हूं। एक data.getJSONArray () या data.getJSONObject () प्राप्त करने की कोशिश कर रहा है, संभवतः एक JSONPception को फेंक देगा !!
P-RAD

हाय मेरा ऑब्जेक्टाटा प्रतिक्रिया के बीच में है तो मैं कैसे पता लगा सकता हूं? यह जांचने के लिए कि क्या JSONObject या JSONArray ??? और आपके उत्तर में स्ट्रिंग डेटा = "{...}"; पूरे प्रतिक्रिया का मूल्य है ???
अमित पंड्या

इसे पूरा करने के लिए, आपको अपने JSON का उपयोग करके पार्स करना होगा JSONTokener। मैंने ऐसा नहीं किया, लेकिन मुझे लगता है कि आपको SkipPast ("your_key") करना चाहिए । किंतु मुझे यकीन नहीं है। हालांकि, आपको जैसन मैपर का उपयोग करने पर विचार करना चाहिए: गॉन, जैक्सन, मोशी और अन्य का टन।
न्यू वर्ल्ड

53

कुछ तरीके हैं जिनसे आप यह कर सकते हैं:

  1. आप स्ट्रिंग के पहले स्थान पर वर्ण की जांच कर सकते हैं (व्हाट्सएप को दूर करने के बाद, जैसा कि वैध JSON में इसकी अनुमति है)। यदि यह एक है {, तो आप एक के साथ काम कर रहे हैं JSONObject, अगर यह एक है [, तो आप एक के साथ काम कर रहे हैं JSONArray
  2. यदि आप JSON (a Object) के साथ काम कर रहे हैं , तो आप एक instanceofचेक कर सकते हैं । yourObject instanceof JSONObject। यह सही होगा अगर आपका ऑबजेक्ट एक JSONObject है। यही बात JSONArray पर लागू होती है।

3
वह निश्चित रूप से काम किया। हालांकि अंत में, मैंने स्ट्रिंग को JSONObject में डाल दिया और अगर यह एक त्रुटि थी, तो मुझे पता था कि यह JSONArray था। {{नया JSONObject (json) वापस करें; } पकड़ (अपवाद ई) {} कोशिश {वापसी नया JSONArray (json); } पकड़ (अपवाद ई) {}
ग्रेग

3
आपका पहला विकल्प मज़बूती से काम नहीं करेगा, क्योंकि JSON डेटा की शुरुआत में व्हॉट्सएप की अनुमति है। आपको किसी भी प्रमुख व्हाट्सएप को छोड़ने और पहले गैर-व्हाट्सएप चरित्र की जांच करने की आवश्यकता है।
user9876

1
@ user9876 सिर के लिए धन्यवाद। आपकी टिप्पणी को प्रतिबिंबित करने के लिए संपादित।
nicholas.hauschild

14

यह एंड्रॉइड पर उपयोग होने वाला सरल उपाय है:

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
}

1
एंड्रॉइड विशिष्ट नहीं है और मुझे यह संस्करण सबसे अच्छा लगता है क्योंकि यह बिना चरित्र जांच का उपयोग करता है, लेकिन लगता है json.has("data")कि पूरी बात वैकल्पिक है (इसके लिए नहीं पूछा गया)।
क्रिस्टोफ रूसो

7

एक और तरीका पेश कर रहा है:

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एक प्रतिक्रिया स्ट्रिंग सर्वर से आ रही है


1

ऐसा करने का एक और मौलिक तरीका निम्नलिखित है।

JsonArrayस्वाभाविक रूप से एक सूची है

JsonObjectस्वाभाविक रूप से एक नक्शा है

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

0

का उदाहरण

Object.getClass ()। GetName ()


मुझे लगता है कि प्रश्न मानता है कि आप एक सादे स्ट्रिंग के साथ काम कर रहे होंगे ताकि Instof या getClass () .Name () का उपयोग न करें।
गेमरन

@ गेमरसन - यह अजीब है - यह मेरे लिए कई बार काम किया है। आपको बस पार्सर को या तो ऑब्जेक्ट पर लौटना है, बनाम जो निर्दिष्ट करना है।
हॉट लिक्स

1
स्पष्ट रूप से लोगों को यह समझ में नहीं आता है। बहुत ज्यादा हर पार्सर मैंने देखा है एक "JSONInstance" या बस "ऑब्जेक्ट", या जो कुछ भी वापस करने के लिए एक पार्स विकल्प है। JSON को पार्स करें और फिर पूछें कि यह क्या है। जिस पार्सर में यह क्षमता नहीं है, वह टूट गया है।
हॉट लक्स

(यह, वास्तव में, न्यूवर्ल्ड का जवाब है, कमोबेश।)
हॉट लिक्स

0

जावास्क्रिप्ट में इस समस्या से निपटने वालों के लिए, निम्नलिखित ने मेरे लिए काम किया (यह सुनिश्चित नहीं है कि यह कितना कुशल है)।

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

-1

मेरा दृष्टिकोण इससे कुल अमूर्त होगा। शायद किसी को यह उपयोगी लगता है ...

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);
...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.