JSON একটি JSONObject বা JSONArray কিনা তা নির্ধারণ করুন


132

আমি সার্ভার থেকে একটি JSON অবজেক্ট বা অ্যারে পেতে যাচ্ছি, তবে এটি কী হবে তা আমার কোনও ধারণা নেই। আমার JSON এর সাথে কাজ করা দরকার, তবে এটি করার জন্য, আমার এটি জানতে হবে এটি কোনও অবজেক্ট বা অ্যারে কিনা।

আমি অ্যান্ড্রয়েড নিয়ে কাজ করছি।

কারও কি এটি করার ভাল উপায় আছে?


Android এর সঙ্গে Gson ব্যবহার যদি এবং যখন এটি একটি উপায় deserialing করতে আসে এটা ভালো হয় এই
pirho

উত্তর:


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/references/org/json/JSONTokener.html#nextValue ()


1
চমৎকার কাজ. আশা করি এটি জসনঅবজেক্ট এবং জসন অ্যারে উভয়ের জন্য চেক করবে
শ্রেয়াশ মহাজন

2
@ নিউওয়ার্ল্ড তবে আমি যদি লুপের মাঝে থাকি তবে কী হবে। একটি ডেটা পাওয়ার চেষ্টা করে। জেজেএসএনআরএ () বা ডেটা.জেট জেএসএনওবজেক্ট () সম্ভাব্যত কোনও জেএসএনএক্সেক্সেপশন ছুড়ে দেবে !!
পি-আরএডি

হাই আমার অবজেক্টটা প্রতিক্রিয়ার মাঝখানে তাই আমি কীভাবে এটি সনাক্ত করতে পারি? এটি একটি JSONObject বা JSONArray কিনা তা পরীক্ষা করতে ??? এবং আপনার উত্তরে স্ট্রিং ডেটা = "{...}"; পুরো প্রতিক্রিয়া মূল্য আছে ???
amit পান্ড্যা

এটি সম্পাদন করতে, আপনাকে আপনার JSON ব্যবহার করে পার্স করতে হবে JSONTokener। আমি এটি করিনি, তবে আমি মনে করি আপনার আগে স্কিপপাস্ট করা উচিত ("আপনার_কি") । কিন্তু আমি নিশ্চিত না. যাইহোক, আপনার জেসন ম্যাপারটি বিবেচনা করা উচিত: গসন, জ্যাকসন, মশি এবং অন্যান্য অনেকগুলি।
নিউরোল্ড

53

এটি করার কয়েকটি উপায় রয়েছে:

  1. আপনি স্ট্রিংয়ের প্রথম অবস্থানে অক্ষরটি পরীক্ষা করতে পারেন (শ্বেত স্পেস ছাঁটাই করার পরে, যেমন এটি বৈধ জেএসএন-এ অনুমোদিত)। যদি এটি হয় তবে আপনি একটি {এর সাথে লেনদেন করছেন JSONObject, যদি এটি হয় তবে [আপনি একটি এর সাথে লেনদেন করছেন JSONArray
  2. আপনি যদি JSON (আন Object) এর সাথে কাজ করছেন তবে আপনি একটি instanceofচেক করতে পারেন । yourObject instanceof JSONObject। এটি সত্য হবে যদি আপনারঅজেক্টটি কোনও জেএসএনওবজেক্ট হয়। একইটি JSONArray এর ক্ষেত্রে প্রযোজ্য।

3
এটি অবশ্যই কাজ করেছিল। যদিও শেষ পর্যন্ত, আমি স্ট্রিংটিকে একটি JSONObject তে রেখেছি এবং যদি এটি কোনও ত্রুটি ছুঁড়ে দেয় তবে আমি জানতাম যে এটি JSONArray। চেষ্টা করুন {নতুন জেএসএনওবজেক্ট (জেসন) ফিরিয়ে দিন; } ধরা (ব্যতিক্রম ই) {} চেষ্টা করুন new নতুন JSONArray (json) ফিরিয়ে দিন; } ধরা (ব্যতিক্রম ই) {}
গ্রেগ

3
আপনার প্রথম বিকল্পটি নির্ভরযোগ্যভাবে কাজ করবে না, কারণ জেএসওএন ডেটার শুরুতে হোয়াইটস্পেসের অনুমতি রয়েছে। আপনাকে যে কোনও শীর্ষস্থানীয় সাদা সাদা জায়গা ছেড়ে যাওয়া এবং প্রথম অ-সাদা অংশের অক্ষর পরীক্ষা করতে হবে।
ব্যবহারকারী9876

1
@ ব্যবহারকারী9876 মাথা আপ জন্য ধন্যবাদ। আপনার মন্তব্য প্রতিফলিত সম্পাদিত।
নিকোলাস.হাউসচাইল্ড

14

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
}

1
অ্যান্ড্রয়েড নির্দিষ্ট নয় এবং আমার এই সংস্করণটি সবচেয়ে ভাল লেগেছে কারণ এতে কোনও অক্ষর যাচাই করা হয়নি, তবে json.has("data")মনে করুন পুরো জিনিসটি alচ্ছিক (জিজ্ঞাসা করা হয়নি)।
ক্রিস্টোফ রাউসি

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


আমি মনে করি যে প্রশ্নটি ধরে নিয়েছে যে আপনি উদাহরণস্বরূপ বা getClass ()। GetName () ব্যবহার করবেন না এমন কাজ করে আপনি একটি সরল স্ট্রিংয়ের সাথে কাজ করবেন।
গেমারসন

@ গেমারসন - এটি অদ্ভুত - এটি আমার জন্য বহুবার কাজ করেছে। আপনার কাছে পার্সার রিটার্ন হবে যে কোনও বস্তু, বনাম যা নির্দিষ্ট করে।
হট লিক্স

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);
...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.