কীভাবে JSONObject এর মাধ্যমে পুনরাবৃত্তি করবেন?


312

আমি একটি JSON লাইব্রেরি ব্যবহার করি JSONObject(আমার যদি প্রয়োজন হয় তবে স্যুইচ করতে আমার আপত্তি নেই)।

আমি কীভাবে পুনরাবৃত্তি করতে হয় তা জানি JSONArrays, তবে আমি যখন ফেসবুক থেকে জেএসএন ডেটা পার্স করি তখন আমি কোনও অ্যারে পাই না, কেবল একটি JSONObject, তবে আমার কোনও সূচীর মাধ্যমে কোনও আইটেম অ্যাক্সেস করতে সক্ষম হওয়া প্রয়োজন, যেমন JSONObject[0]প্রথমটি পেতে এবং আমি কীভাবে এটি করা যায় তা বুঝতে পারি না।

{
   "http://http://url.com/": {
      "id": "http://http://url.com//"
   },
   "http://url2.co/": {
      "id": "http://url2.com//",
      "shares": 16
   }
   ,
   "http://url3.com/": {
      "id": "http://url3.com//",
      "shares": 16
   }
}


এটি ব্যবহার করে দেখুন: stackoverflow.com/a/56223923/10268067
স্টিভ Moretz

উত্তর:


594

সম্ভবত এটি সাহায্য করবে:

JSONObject jsonObject = new JSONObject(contents.trim());
Iterator<String> keys = jsonObject.keys();

while(keys.hasNext()) {
    String key = keys.next();
    if (jsonObject.get(key) instanceof JSONObject) {
          // do something with jsonObject here      
    }
}

20
সবাই সাবধান থাকুন, jObject.keys () পুনরাবৃত্ত সূচক ক্রম দিয়ে পুনরাবৃত্তিকে ফেরত দেয়।
macio.

77
@ ম্যাকিও.জুন তবুও, আদেশের বৈশিষ্ট্যগুলির মানচিত্রে কিছু যায় আসে না: কীগুলি আনঅর্ডারড JSONObjectহয় এবং আপনার দাবিটি একটি বেসরকারী প্রয়োগের একটি সাধারণ প্রতিচ্ছবি ছিল;)
ক্যালিগারী

6
যখন আমাদের ক্রমিকভাবে সমস্ত কীগুলি প্রয়োজন তখন কী ব্যবহার করবেন?
আগ্রহী

11
সামান্য বায়ুযুক্ত: এটি কি দু'বার কী অনুসন্ধান করতে পরিচালিত করে না? 'অবজেক্ট ও = জবজেক্ট.জেট (কী)' করা ভাল, তার প্রকারটি পরীক্ষা করে তারপরে আবার (কী) কল না করে এটি ব্যবহার করুন।
টম

1
@ টম ফর-প্রতিটি লুপগুলি কোনও সংগ্রহের উপরে পুনরাবৃত্তি করার সময় দরকারী:for (String key : keys)
ক্যালিগারি

86

আমার ক্ষেত্রে আমি names()কাজগুলি পুনরাবৃত্তি করতে ভাল পেয়েছি

for(int i = 0; i<jobject.names().length(); i++){
    Log.v(TAG, "key = " + jobject.names().getString(i) + " value = " + jobject.get(jobject.names().getString(i)));
}

1
যদিও এই উদাহরণটি Iteratingজাভা হিসাবে সত্যই বোঝা যায় নি , এটি বেশ ভালভাবে কাজ করে! ধন্যবাদ।
টিম ভিজি

57

আমি পুনরাবৃত্তিকে এড়িয়ে যাব কারণ তারা পুনরাবৃত্তির সময় অবজেক্ট যুক্ত করতে / মুছে ফেলতে পারে, লুপের জন্য পরিষ্কার কোড ব্যবহারের জন্যও। এটি কেবল পরিষ্কার এবং কম লাইন হবে।

জাভা 8 এবং লামদা ব্যবহার করুন [আপডেট 4/2/2019]

import org.json.JSONObject;

public static void printJsonObject(JSONObject jsonObj) {
    jsonObj.keySet().forEach(keyStr ->
    {
        Object keyvalue = jsonObj.get(keyStr);
        System.out.println("key: "+ keyStr + " value: " + keyvalue);

        //for nested objects iteration if required
        //if (keyvalue instanceof JSONObject)
        //    printJsonObject((JSONObject)keyvalue);
    });
}

পুরানো উপায় ব্যবহার করে [আপডেট 4/2/2019]

import org.json.JSONObject;

public static void printJsonObject(JSONObject jsonObj) {
    for (String keyStr : jsonObj.keySet()) {
        Object keyvalue = jsonObj.get(keyStr);

        //Print key and value
        System.out.println("key: "+ keyStr + " value: " + keyvalue);

        //for nested objects iteration if required
        //if (keyvalue instanceof JSONObject)
        //    printJsonObject((JSONObject)keyvalue);
    }
}

আসল উত্তর

import org.json.simple.JSONObject;
public static void printJsonObject(JSONObject jsonObj) {
    for (Object key : jsonObj.keySet()) {
        //based on you key types
        String keyStr = (String)key;
        Object keyvalue = jsonObj.get(keyStr);

        //Print key and value
        System.out.println("key: "+ keyStr + " value: " + keyvalue);

        //for nested objects iteration if required
        if (keyvalue instanceof JSONObject)
            printJsonObject((JSONObject)keyvalue);
    }
}

5
তারা কখনও বলেনি যে তারা org.json.simple (যা একটি গুগল গ্রন্থাগার) ব্যবহার করছে। দুর্ভাগ্যক্রমে স্ট্যান্ডার্ড org.json.JSONObject আপনাকে একটি পুনরাবৃত্তি ব্যবহার করতে বাধ্য করে।
অমলগোভিনাস

1
আপনি আমার কিন্তু এখানে সংরক্ষণ!
Lukuluba

1
org.json.JSONObject এর কীসেট নেই ()
রিধুবর্ধন

আপনি কি সংস্করণ খুঁজছেন? stleary.github.io/JSON-java/org/json/JSONObject.html#keySet--
maaz

38

বিশ্বাস করা যায় না যে এই উত্তরে একটি পুনরুক্তি ব্যবহারের চেয়ে সহজ এবং সুরক্ষিত সমাধান আর নেই ...

JSONObject names ()পদ্ধতিটি কীগুলির মধ্যে একটি ফেরত JSONArrayদেয় JSONObject, যাতে আপনি এটি লুপে থাকা সত্ত্বেও চলতে পারেন:

JSONObject object = new JSONObject ();
JSONArray keys = object.names ();

for (int i = 0; i < keys.length (); ++i) {

   String key = keys.getString (i); // Here's your key
   String value = object.getString (key); // Here's your value

}

1
এখানে আপত্তি কি?
আরসিএস

1
এটা JSONObject। কিছু একটা JSONObject object = new JSONObject ("{\"key1\",\"value1\"}");। কিন্তু এটি কাঁচা JSON করা না, সঙ্গে এটি আইটেমগুলি জুড়ুন put ()পদ্ধতি: object.put ("key1", "value1");
আকুনা

18
Iterator<JSONObject> iterator = jsonObject.values().iterator();

while (iterator.hasNext()) {
 jsonChildObject = iterator.next();

 // Do whatever you want with jsonChildObject 

  String id = (String) jsonChildObject.get("id");
}

jsonChildObject = iterator.next();সম্ভবত সংজ্ঞায়িত করা উচিত jsonChildObjectমত, JSONObject jsonChildObject = iterator.next();, তাই না?
কনটুর

1
আমি এই সমাধানটি পছন্দ করি, তবে ঘোষণা করছি Iterator<JSONObject> একটি সতর্কতা দেবে। আমি এটিকে জেনেরিকের সাথে প্রতিস্থাপন <?>করব এবং কল করার জন্য একটি কাস্ট করব next()। এছাড়াও, আমি কাস্ট করে সংরক্ষণ করার getString("id")পরিবর্তে ব্যবহার করব get("id")
আরটিএফ

9

org.json.JSONObject এর এখন একটি কীসেট () পদ্ধতি রয়েছে যা একটি দেয় Set<String>এবং সহজেই প্রতিটিটির জন্য লুপ করা যায়।

for(String key : jsonObject.keySet())

আমি মনে করি এটি সবচেয়ে সুবিধাজনক সমাধান। পরামর্শের জন্য ধন্যবাদ :)
ইউরি রবিস্কো

1
আপনি আপনার উদাহরণটি সম্পূর্ণ করতে পারেন?
কুসংস্কারের

6

প্রথমে এটি কোথাও রাখুন:

private <T> Iterable<T> iteratorToIterable(final Iterator<T> iterator) {
    return new Iterable<T>() {
        @Override
        public Iterator<T> iterator() {
            return iterator;
        }
    };
}

বা আপনার জাভা 8 এ অ্যাক্সেস থাকলে কেবল এটি:

private <T> Iterable<T> iteratorToIterable(Iterator<T> iterator) {
    return () -> iterator;
}

তারপরে কেবল অবজেক্টের কী এবং মানগুলি নিয়ে পুনরাবৃত্তি করুন:

for (String key : iteratorToIterable(object.keys())) {
    JSONObject entry = object.getJSONObject(key);
    // ...

আমি এটির জন্য ভোট দিয়েছি, তবে "স্ট্রিং কী: ...." সংকলন করে না, এবং পুনরাবৃত্তির উপর একটি চেক না করা warningালাই সতর্কতা এড়ানোর কোনও উপায় বলে মনে হচ্ছে না। বোকা পুনরুক্তি।
অমলগোভিনাস

2

আমি একটি ছোট পুনরাবৃত্তি ফাংশন তৈরি করেছি যা পুরো জেসন বস্তুর মধ্য দিয়ে যায় এবং মূল পথ এবং এর মান সংরক্ষণ করে।

// My stored keys and values from the json object
HashMap<String,String> myKeyValues = new HashMap<String,String>();

// Used for constructing the path to the key in the json object
Stack<String> key_path = new Stack<String>();

// Recursive function that goes through a json object and stores 
// its key and values in the hashmap 
private void loadJson(JSONObject json){
    Iterator<?> json_keys = json.keys();

    while( json_keys.hasNext() ){
        String json_key = (String)json_keys.next();

        try{
            key_path.push(json_key);
            loadJson(json.getJSONObject(json_key));
       }catch (JSONException e){
           // Build the path to the key
           String key = "";
           for(String sub_key: key_path){
               key += sub_key+".";
           }
           key = key.substring(0,key.length()-1);

           System.out.println(key+": "+json.getString(json_key));
           key_path.pop();
           myKeyValues.put(key, json.getString(json_key));
        }
    }
    if(key_path.size() > 0){
        key_path.pop();
    }
}

2

জাভা 8 এবং ল্যাম্বদা, ক্লিনার সহ:

JSONObject jObject = new JSONObject(contents.trim());

jObject.keys().forEachRemaining(k ->
{

});

https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#forEachRemaining-java.util.function.Consumer-


এটি কেবল কীগুলি পুনরুক্ত করে তবে আপনার এখনও মানটি পাওয়া দরকার, যাতে আপনি jObject.get (কে) ব্যবহার করতে পারেন;
মিকেল

আমি "নাল থেকে গ্রাহককে ন্যূনতম এপিআই 24 লাগবে"
হর্ষিল পানসারে

2

JSONObjectক্ষেত্রগুলিতে পুনরাবৃত্তি করতে আমরা নীচে কোড সেট ব্যবহার করেছি

Iterator iterator = jsonObject.entrySet().iterator();

while (iterator.hasNext())  {
        Entry<String, JsonElement> entry = (Entry<String, JsonElement>) iterator.next();
        processedJsonObject.add(entry.getKey(), entry.getValue());
}

1

আমার একবার একটি জসন ছিল যার আইডিস ছিল যা তাদের দ্বারা বাড়ানো দরকার যেহেতু তারা 0-সূচকযুক্ত এবং এটি মাইকিউএল অটো-ইনক্রিমেন্টটি ভেঙেছিল।

সুতরাং প্রতিটি বস্তুর জন্য আমি এই কোডটি লিখেছি - কারও পক্ষে সহায়ক হতে পারে:

public static void  incrementValue(JSONObject obj, List<String> keysToIncrementValue) {
        Set<String> keys = obj.keySet();
        for (String key : keys) {
            Object ob = obj.get(key);

            if (keysToIncrementValue.contains(key)) {
                obj.put(key, (Integer)obj.get(key) + 1);
            }

            if (ob instanceof JSONObject) {
                incrementValue((JSONObject) ob, keysToIncrementValue);
            }
            else if (ob instanceof JSONArray) {
                JSONArray arr = (JSONArray) ob;
                for (int i=0; i < arr.length(); i++) {
                    Object arrObj = arr.get(0);
                    if (arrObj instanceof JSONObject) {
                        incrementValue((JSONObject) arrObj, keysToIncrementValue);
                    }
                }
            }
        }
    }

ব্যবহার:

JSONObject object = ....
incrementValue(object, Arrays.asList("id", "product_id", "category_id", "customer_id"));

এটি JSONArray এর পক্ষে প্যারেন্ট অবজেক্ট হিসাবেও রূপান্তর করতে পারে


1

এখানে বেশিরভাগ উত্তর ফ্ল্যাট জেএসএন কাঠামোর জন্য, যদি আপনার কাছে কোনও জেএসওএন থাকে যা জেএসএনআরাই বা নেস্টেড জেএসএনওবজেক্টসকে নেস্ট করে থাকতে পারে তবে আসল জটিলতা দেখা দেয়। নিম্নলিখিত কোড স্নিপেট যেমন একটি ব্যবসায়ের প্রয়োজন যত্ন নেয়। এটি একটি হ্যাশ মানচিত্র নেয়, এবং নেস্টেড জেএসোনআরাই এবং জেএসওএনওজেক্টস উভয়ের সাথে শ্রেণিবদ্ধ জেএসওএন নেয় এবং হ্যাশ মানচিত্রে ডেটা সহ জেএসওএন আপডেট করে

public void updateData(JSONObject fullResponse, HashMap<String, String> mapToUpdate) {

    fullResponse.keySet().forEach(keyStr -> {
        Object keyvalue = fullResponse.get(keyStr);

        if (keyvalue instanceof JSONArray) {
            updateData(((JSONArray) keyvalue).getJSONObject(0), mapToUpdate);
        } else if (keyvalue instanceof JSONArray) {
            updateData((JSONObject) keyvalue, mapToUpdate);
        } else {
            // System.out.println("key: " + keyStr + " value: " + keyvalue);
            if (mapToUpdate.containsKey(keyStr)) {
                fullResponse.put(keyStr, mapToUpdate.get(keyStr));
            }
        }
    });

}

আপনাকে এখানে লক্ষ করতে হবে যে এর রিটার্নের ধরনটি অকার্যকর, তবে রেফারেন্স হিসাবে সাইস অবজেক্টগুলি পাস করা হয় এই পরিবর্তনটি কলারের কাছে রেফারেক্ট করা হয়।


0

নীচের কোডটি আমার পক্ষে ভাল কাজ করেছে। টিউনিং করা যেতে পারলে দয়া করে আমাকে সহায়তা করুন। এটি নেস্টেড জেএসওএন বস্তু থেকে সমস্ত কীগুলি পায়।

public static void main(String args[]) {
    String s = ""; // Sample JSON to be parsed

    JSONParser parser = new JSONParser();
    JSONObject obj = null;
    try {
        obj = (JSONObject) parser.parse(s);
        @SuppressWarnings("unchecked")
        List<String> parameterKeys = new ArrayList<String>(obj.keySet());
        List<String>  result = null;
        List<String> keys = new ArrayList<>();
        for (String str : parameterKeys) {
            keys.add(str);
            result = this.addNestedKeys(obj, keys, str);
        }
        System.out.println(result.toString());
    } catch (ParseException e) {
        e.printStackTrace();
    }
}
public static List<String> addNestedKeys(JSONObject obj, List<String> keys, String key) {
    if (isNestedJsonAnArray(obj.get(key))) {
        JSONArray array = (JSONArray) obj.get(key);
        for (int i = 0; i < array.length(); i++) {
            try {
                JSONObject arrayObj = (JSONObject) array.get(i);
                List<String> list = new ArrayList<>(arrayObj.keySet());
                for (String s : list) {
                    putNestedKeysToList(keys, key, s);
                    addNestedKeys(arrayObj, keys, s);
                }
            } catch (JSONException e) {
                LOG.error("", e);
            }
        }
    } else if (isNestedJsonAnObject(obj.get(key))) {
        JSONObject arrayObj = (JSONObject) obj.get(key);
        List<String> nestedKeys = new ArrayList<>(arrayObj.keySet());
        for (String s : nestedKeys) {
            putNestedKeysToList(keys, key, s);
            addNestedKeys(arrayObj, keys, s);
        }
    }
    return keys;
}

private static void putNestedKeysToList(List<String> keys, String key, String s) {
    if (!keys.contains(key + Constants.JSON_KEY_SPLITTER + s)) {
        keys.add(key + Constants.JSON_KEY_SPLITTER + s);
    }
}



private static boolean isNestedJsonAnObject(Object object) {
    boolean bool = false;
    if (object instanceof JSONObject) {
        bool = true;
    }
    return bool;
}

private static boolean isNestedJsonAnArray(Object object) {
    boolean bool = false;
    if (object instanceof JSONArray) {
        bool = true;
    }
    return bool;
}

-1

এটি সমস্যার আরেকটি কার্যক্ষম সমাধান:

public void test (){

    Map<String, String> keyValueStore = new HasMap<>();
    Stack<String> keyPath = new Stack();
    JSONObject json = new JSONObject("thisYourJsonObject");
    keyValueStore = getAllXpathAndValueFromJsonObject(json, keyValueStore, keyPath);
    for(Map.Entry<String, String> map : keyValueStore.entrySet()) {
        System.out.println(map.getKey() + ":" + map.getValue());
    }   
}

public Map<String, String> getAllXpathAndValueFromJsonObject(JSONObject json, Map<String, String> keyValueStore, Stack<String> keyPath) {
    Set<String> jsonKeys = json.keySet();
    for (Object keyO : jsonKeys) {
        String key = (String) keyO;
        keyPath.push(key);
        Object object = json.get(key);

        if (object instanceof JSONObject) {
            getAllXpathAndValueFromJsonObject((JSONObject) object, keyValueStore, keyPath);
        }

        if (object instanceof JSONArray) {
            doJsonArray((JSONArray) object, keyPath, keyValueStore, json, key);
        }

        if (object instanceof String || object instanceof Boolean || object.equals(null)) {
            String keyStr = "";

            for (String keySub : keyPath) {
                keyStr += keySub + ".";
            }

            keyStr = keyStr.substring(0, keyStr.length() - 1);

            keyPath.pop();

            keyValueStore.put(keyStr, json.get(key).toString());
        }
    }

    if (keyPath.size() > 0) {
        keyPath.pop();
    }

    return keyValueStore;
}

public void doJsonArray(JSONArray object, Stack<String> keyPath, Map<String, String> keyValueStore, JSONObject json,
        String key) {
    JSONArray arr = (JSONArray) object;
    for (int i = 0; i < arr.length(); i++) {
        keyPath.push(Integer.toString(i));
        Object obj = arr.get(i);
        if (obj instanceof JSONObject) {
            getAllXpathAndValueFromJsonObject((JSONObject) obj, keyValueStore, keyPath);
        }

        if (obj instanceof JSONArray) {
            doJsonArray((JSONArray) obj, keyPath, keyValueStore, json, key);
        }

        if (obj instanceof String || obj instanceof Boolean || obj.equals(null)) {
            String keyStr = "";

            for (String keySub : keyPath) {
                keyStr += keySub + ".";
            }

            keyStr = keyStr.substring(0, keyStr.length() - 1);

            keyPath.pop();

            keyValueStore.put(keyStr , json.get(key).toString());
        }
    }
    if (keyPath.size() > 0) {
        keyPath.pop();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.