JSON Array ซ้ำใน Android / Java


148

ฉันกำลังสร้างแอพ Android ที่ต้องการดาวน์โหลดและซิงโครไนซ์กับฐานข้อมูลออนไลน์ฉันกำลังส่งข้อความค้นหาของฉันจากแอปไปยังหน้า php ซึ่งส่งคืนแถวที่เกี่ยวข้องจากฐานข้อมูลในรูปแบบ 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");
}

ดังนั้นฉันคิดว่าฉันสามารถเปลี่ยน Json ที่คืนมาให้เป็นอาร์เรย์และทำซ้ำได้ ความคิดเห็นใดที่ฉันสามารถทำได้

ฉันขอโทษสำหรับคนจรจัดของฉัน แต่ฉันได้ทำงานนี้จากตัวอย่างที่ฉันพบในเว็บและตั้งแต่นั้นมาก็ไม่สามารถหาได้


1
ตรวจสอบลิงค์ต่อไปนี้: androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial
Aakash

คำตอบ:


67

ฉันได้ทำสองวิธีที่แตกต่างกัน

1. ) ทำแผนที่

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

2. ) สร้างชื่อ 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
ดีและเรียบง่าย! ใช้งานได้ดี!
Kervin Ramen

5
โปรดทราบว่าถ้าคุณส่ง "อาร์เรย์" ที่ไม่มีตัวเลขติดต่อกันคุณจะต้องใช้ JSONObject
max4ever

ใช่มันสมบูรณ์แบบ แต่ในขณะที่ข้อมูลจำนวนมากมันช้ามากในการประมวลผล: (
Ahmad Arslan

@ArslanAhmad หากคุณมีข้อมูลจำนวนมากคุณไม่ต้องการสร้างอาร์เรย์วัตถุ json ทั้งหมดในหน่วยความจำ ใช้วิธีการคล้าย SAX แทน ดูที่นี่: stackoverflow.com/questions/10657725/…
vipw

มันใช้งานไม่ได้สำหรับฉัน ฉันได้รับข้อยกเว้น JSON เนื่องจากวงเล็บ "{" ล้อมรอบวัตถุ?
filthy_wizard

7

น่าเสียดายที่JSONArray ไม่รองรับforeachข้อความเช่น:

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


มันทำ แต่มันคืนค่าอ็อบเจกต์ไม่ใช่ JSONObject
ข้อผิดพลาด

3
คลาส JSONArray ไม่ได้ใช้อินเตอร์เฟส Iterable
Jorgesys

4

เมื่อฉันลอง @ vipw ข้อเสนอแนะของฉันฉันต้องเผชิญกับข้อยกเว้นนี้: 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...
}

สำหรับ Android ฉันเปลี่ยน myJsonArray.size () เป็น myJsonArray.length () แทน
Rishiraj Purohit

3

หากคุณกำลังใช้การติดตั้งJSON.org Javaซึ่งเป็นโอเพ่นซอร์สคุณสามารถทำให้ JSONArray ใช้Iterableอินเทอร์เฟซและเพิ่มวิธีการต่อไปนี้ในคลาส:

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

สิ่งนี้จะทำให้อินสแตนซ์ทั้งหมดของ JSONArray iterable ซึ่งหมายความว่าfor (Object foo : bar)ขณะนี้ไวยากรณ์จะทำงานกับมันได้ (โปรดทราบว่า foo ต้องเป็นวัตถุเนื่องจาก JSONArrays ไม่มีประเภทที่ประกาศไว้) ทั้งหมดนี้ใช้งานได้เนื่องจากคลาส JSONArray ได้รับการสนับสนุนโดย ArrayList แบบง่ายซึ่งสามารถทำซ้ำได้แล้ว ฉันจินตนาการว่าการใช้งานโอเพ่นซอร์สอื่น ๆ นั้นง่ายต่อการเปลี่ยนแปลง


1
สิ่งที่น่าสนใจคือในครั้งเดียวที่การใช้งาน JSON.org มี Iterator ในชั้นเรียน JSONArray แต่พวกเขาก็ลบมัน: github.com/douglascrockford/JSON-java/commit/ …
vipw

@ vipw ฉันส่งอีเมลถึงพวกเขาครั้งหนึ่งเกี่ยวกับการใช้ Iterable แต่พวกเขากล่าวว่าในท้ายที่สุดพวกเขาทำไม่ได้เพราะมันจะทำลายความเข้ากันได้กับ Java 1.4 บางทีนั่นอาจเป็นเหตุผลว่าทำไมมันถึงถูกลบออกไป
Thunderforge


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

ในขณะที่วนซ้ำแถว JSON (org.json.JSONArray ที่สร้างขึ้นใน Android) ระวังวัตถุว่าง ตัวอย่างเช่นคุณอาจได้รับ"null"แทนnullสตริง

ตรวจสอบอาจมีลักษณะ:

s[i] = array.isNull(i) ? null : array.getString(i);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.