অ্যান্ড্রয়েড / জাভাতে JSON অ্যারে পুনরাবৃত্তি


148

আমি একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করছি যা একটি অনলাইন ডাটাবেসের সাথে ডাউনলোড এবং সিঙ্ক্রোনাইজ করা দরকার, আমি অ্যাপ্লিকেশন থেকে আমার ক্যোয়ারীটি পিএইচপি পৃষ্ঠায় প্রেরণ করছি যা JSON ফর্ম্যাটে একটি ডাটাবেস থেকে প্রাসঙ্গিক সারিগুলি ফিরিয়ে দেয়।

কেউ দয়া করে আমাকে JSON অ্যারের মাধ্যমে পুনরাবৃত্তি করার সর্বোত্তম উপায় বলতে পারেন?

আমি বস্তুর একটি অ্যারে পাই:

[{json object},{json object},{json object}]

অ্যারেতে JSONObjects অ্যাক্সেস করতে আমি ব্যবহার করতে পারি সবচেয়ে সহজ কোডটি কী?

সম্পাদনা: এখন যে বিষয়টি আমি লুপটি পুনরায় পুনরুক্ত করার জন্য ব্যবহার করেছিলাম তাটি মনে করি:

for (String row: json){
     id = row.getInt("id");
     name = row.getString("name");
     password = row.getString("password");
}

সুতরাং আমি অনুমান করি যে আমি কোনওভাবেই ফিরে আসা জসনকে এবং পুনরাবৃত্ত অ্যারেতে পরিণত করতে সক্ষম হয়েছি। কোন ধারণা আমি কীভাবে এটি অর্জন করতে পারি?

আমি আমার অস্পষ্টতার জন্য ক্ষমা চাইছি তবে ওয়েবে আমি যে উদাহরণটি পেয়েছি তা থেকেই আমার এটি কাজ হয়েছিল এবং তখন থেকে এটি খুঁজে পেতে অক্ষম।


1
নিম্নলিখিত লিঙ্কটি দেখুন: androidbeasts.wordpress.com/2015/08/04/json-parsing- টিউটোরিয়াল
আকাশ

উত্তর:


67

আমি এটি দুটি ভিন্ন উপায়ে করেছি,

১) একটি মানচিত্র তৈরি করুন

        HashMap<String, String> applicationSettings = new HashMap<String,String>();
        for(int i=0; i<settings.length(); i++){
            String value = settings.getJSONObject(i).getString("value");
            String name = settings.getJSONObject(i).getString("name");
            applicationSettings.put(name, value);
        }

২) নামের JSONArray তৈরি করুন

    JSONArray names = json.names();
    JSONArray values = json.toJSONArray(names);
    for(int i=0; i<values.length(); i++){
        if (names.getString(i).equals("description")){
            setDescription(values.getString(i));
        }
        else if (names.getString(i).equals("expiryDate")){
            String dateString = values.getString(i);
            setExpiryDate(stringToDateHelper(dateString)); 
        }
        else if (names.getString(i).equals("id")){
            setId(values.getLong(i));
        }
        else if (names.getString(i).equals("offerCode")){
            setOfferCode(values.getString(i));
        }
        else if (names.getString(i).equals("startDate")){
            String dateString = values.getString(i);
            setStartDate(stringToDateHelper(dateString));
        }
        else if (names.getString(i).equals("title")){
            setTitle(values.getString(i));
        }
    }

335

আমি মনে করি এই কোডটি সংক্ষিপ্ত এবং স্পষ্ট:

int id;
String name;
JSONArray array = new JSONArray(string_of_json_array);
for (int i = 0; i < array.length(); i++) {
    JSONObject row = array.getJSONObject(i);
    id = row.getInt("id");
    name = row.getString("name");
}

যে আপনি এ খুঁজছেন সেটা কি?


3
সুন্দর এবং সহজ! দুর্দান্ত কাজ!
কারভিন রামেন

5
মনে রাখবেন যে আপনি যদি এমন একটি "অ্যারে" প্রেরণ করেন যার ধারাবাহিক সংখ্যা নেই, আপনাকে JSONObject ব্যবহার করতে হবে
সর্বাধিক 4

হ্যাঁ এটি নিখুঁত তবে বিপুল পরিমাণে ডেটা প্রক্রিয়াকরণে এটি খুব ধীর হচ্ছে :(
আহমদ আরসলান

@ আরস্লানআহমাদ আপনার কাছে যদি প্রচুর পরিমাণে ডেটা থাকে তবে আপনি মেমরির পুরো জেসন অবজেক্ট অ্যারে তৈরি করতে চান না। পরিবর্তে একটি স্যাক্স-মত পদ্ধতির ব্যবহার করুন। এখানে দেখুন: stackoverflow.com/questions/10657725/...
vipw

এটা আমার জন্য কাজ করে না। আমি একটি জেএসএন ব্যতিক্রম পাই কারণ the
ফিলিটি_উইজার্ড

7

দুর্ভাগ্যক্রমে, বিবৃতি সমর্থন JSONArray করে নাforeach :

for(JSONObject someObj : someJsonArray) {
    // do something about someObj
    ....
    ....
}


এটি করে, তবে এটি JSONObject না করে বস্তুটি ফেরত দেয়
ত্রুটি

3
JSONArray বর্গ Iteable ইন্টারফেস প্রয়োগ করে না
জর্জেসিস

4

আমি যখন ভিআইপিডব্লিউর পরামর্শটি চেষ্টা করেছি, তখন আমি এই ব্যতিক্রমের মুখোমুখি হয়েছিলাম: The method getJSONObject(int) is undefined for the type JSONArray

এটি পরিবর্তে আমার জন্য কাজ করেছে:

int myJsonArraySize = myJsonArray.size();

for (int i = 0; i < myJsonArraySize; i++) {
    JSONObject myJsonObject = (JSONObject) myJsonArray.get(i);

    // Do whatever you have to do to myJsonObject...
}

অ্যান্ড্রয়েডের জন্য, আমি এর পরিবর্তে আমার জসনআরএ.সাইজ () -কে আমার জসনআর.লেয়েন্থে () পরিবর্তিত করেছিলাম
পুরোহিত

3

আপনি যদি JSON.org জাভা বাস্তবায়ন ব্যবহার করছেন , যা ওপেন সোর্স, আপনি কেবল JSONArray Iterableইন্টারফেসটি প্রয়োগ করতে এবং নিম্নলিখিত পদ্ধতিটি শ্রেণিতে যুক্ত করতে পারেন:

@Override
public Iterator iterator() {
    return this.myArrayList.iterator();
}

এটি JSONArray এর সমস্ত উদাহরণকে পুনরাবৃত্তিযোগ্য করে তুলবে, যার অর্থ for (Object foo : bar)সিনট্যাক্স এখন এটির সাথে কাজ করবে (নোট করুন foo একটি অবজেক্ট হতে হবে, কারণ JSONArrays এর কোনও ঘোষিত প্রকার নেই)। এই সমস্ত কাজ করে কারণ JSONArray শ্রেণি একটি সাধারণ অ্যারেলিস্ট দ্বারা সমর্থিত, যা ইতিমধ্যে পুনরাবৃত্তিযোগ্য। আমি ধারণা করি যে অন্যান্য ওপেন সোর্স বাস্তবায়নগুলি যেমন পরিবর্তন করা ঠিক তত সহজ হবে।


1
মজার বিষয়টি হ'ল এক সময় JSON.org বাস্তবায়নের JSONArray ক্লাসে একজন আইট্রেটার ছিল, তবে তারা এটি সরিয়ে নিয়েছে: github.com/douglascrockford/JSON-java/commit/…
ভিপিডব্লু

@ ভিপিডাব্লু আমি একবার তাদেরকে ইটেবল প্রয়োগের বিষয়ে ইমেল করেছিলাম, কিন্তু তারা বলেছিল যে শেষ পর্যন্ত তারা তা করতে পারেনি কারণ এটি জাভা ১.৪ এর সাথে সামঞ্জস্যতা ভঙ্গ করবে। সম্ভবত সে কারণেই এটি প্রতিশ্রুতিবদ্ধভাবে অপসারণ করা হয়েছিল।
থান্ডারফোর্জ


2

আপনি প্রতিটি প্রবেশের জন্য একই কাস্ট অবজেক্টটি ব্যবহার করছেন। প্রতিটি পুনরাবৃত্তিতে আপনি কেবল নতুন একটি তৈরি করার পরিবর্তে একই বস্তুটি পরিবর্তন করেছেন।

এই কোডটি এটি ঠিক করা উচিত:

JSONArray jCastArr = jObj.getJSONArray("abridged_cast");
ArrayList<Cast> castList= new ArrayList<Cast>();

for (int i=0; i < jCastArr.length(); i++) {
    Cast person = new Cast();  // create a new object here
    JSONObject jpersonObj = jCastArr.getJSONObject(i);

    person.castId = (String) jpersonObj.getString("id");
    person.castFullName = (String) jpersonObj.getString("name");

    castList.add(person);
}
details.castList = castList;

1

কোনও জেএসএন অ্যারের মাধ্যমে পুনরাবৃত্তি করার সময় (অ্যান্ড্রয়েডে নির্মিত org.json.JSONArray) নাল বস্তুগুলির জন্য নজর রাখুন ; উদাহরণস্বরূপ, আপনি "null"একটি নাল পরিবর্তে পেতে পারেন স্ট্রিংয়ের ।

একটি চেক দেখতে লাগতে পারে:

s[i] = array.isNull(i) ? null : array.getString(i);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.