การแปลง JSONarray เป็น ArrayList


107

ฉันกำลังดาวน์โหลดสตริง JSON และแปลงเป็น JSONArray ฉันใส่ลงใน listview และจำเป็นต้องสามารถลบออกจาก listview นั้นได้ในภายหลังและเนื่องจาก JSONArray ไม่มีเมธอด. ลบ (ขอบคุณโอบามา) ฉันจึงพยายามแปลงเป็นอาร์เรย์

นี่คือ JSON ของฉัน (array.toString ()):

[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}]

ฉันต้องการใส่มันลงในอาร์เรย์และสามารถเรียกสตริงด้วยคีย์ที่เกี่ยวข้องได้ ขอบคุณทุกความช่วยเหลือ!


เมื่อคุณพูดว่าคีย์ไม่ได้หมายความว่าพจนานุกรม (แผนที่ใน Android) บางประเภทหรือไม่? อาร์เรย์จะอิงตามดัชนี ดูวิธีสร้างและใช้งานได้ที่developer.android.com/reference/java/util/Map.html
brianestey

สามารถใช้แผนที่เพื่อเติมข้อมูลมุมมองรายการด้วย baseadapter ที่กำหนดเองได้หรือไม่ Id ไม่ควรใช้ดัชนีในกรณีที่ JSON เคยเปลี่ยนลำดับ
TheGeekNess

ListView จะได้รับวัตถุจากอะแดปเตอร์ตามดัชนีดังนั้นในกรณีใด ๆ คุณจะต้องรักษารายการตามลำดับ หากคุณต้องการรักษาลำดับของคีย์ (และรู้ว่าคีย์นั้นอยู่ในช่วงเวลาใดในการคอมไพล์) คุณสามารถฮาร์ดโค้ดอาร์เรย์ของคีย์เหล่านั้นตามลำดับที่คุณต้องการและใช้สำหรับการสั่งซื้อของคุณเมื่อดึงข้อมูลจากแผนที่
brianestey

คำตอบ:


164
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
   for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i));
   } 
} 

3
และlistdata.add(jArray.optJSONObject(i));ถ้า listdata ของคุณเป็น JSONObject arrayList ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian

2
ตัวอย่างที่ดี ในกรณีที่ใครต้องการ: มีคลาสตัวช่วยที่แปลง JSONObject / JSONArray เป็นแผนที่ / รายการมาตรฐานบน github gist.github.com/codebutler/2339666
inexcii

2
ทำไมไม่ใช้ArrayList<Object>?
natanavra

ฉันจะจัดการ Json Array ว่างเปล่าได้อย่างไร โปรดตอบฉันด้วยครับ
MohanRaj S

3
มีวิธีอื่นในการทำเช่นนี้โดยไม่วนซ้ำหรือไม่?
K.Sopheak

67

ฉันได้กระทำมันใช้Gson(โดย Google)

เพิ่มบรรทัดต่อไปนี้ในโมดูลของคุณbuild.gradle:

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON สตริง:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"ravi@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c201\",\n" +
            "                \"name\": \"Johnny Depp\",\n" +
            "                \"email\": \"johnny_depp@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c202\",\n" +
            "                \"name\": \"Leonardo Dicaprio\",\n" +
            "                \"email\": \"leonardo_dicaprio@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c203\",\n" +
            "                \"name\": \"John Wayne\",\n" +
            "                \"email\": \"john_wayne@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c204\",\n" +
            "                \"name\": \"Angelina Jolie\",\n" +
            "                \"email\": \"angelina_jolie@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c205\",\n" +
            "                \"name\": \"Dido\",\n" +
            "                \"email\": \"dido@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c206\",\n" +
            "                \"name\": \"Adele\",\n" +
            "                \"email\": \"adele@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c207\",\n" +
            "                \"name\": \"Hugh Jackman\",\n" +
            "                \"email\": \"hugh_jackman@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c208\",\n" +
            "                \"name\": \"Will Smith\",\n" +
            "                \"email\": \"will_smith@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c209\",\n" +
            "                \"name\": \"Clint Eastwood\",\n" +
            "                \"email\": \"clint_eastwood@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2010\",\n" +
            "                \"name\": \"Barack Obama\",\n" +
            "                \"email\": \"barack_obama@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2011\",\n" +
            "                \"name\": \"Kate Winslet\",\n" +
            "                \"email\": \"kate_winslet@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2012\",\n" +
            "                \"name\": \"Eminem\",\n" +
            "                \"email\": \"eminem@gmail.com\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        }\n" +
            "    ]";

ContactModel.java:

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

รหัสสำหรับการแปลงสตริง JSON เป็นArrayList<Model>:

หมายเหตุ: คุณต้องนำเข้าjava.lang.reflect.Type;:

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

หวังว่านี่จะช่วยคุณได้


4
สามเส้น ... เสร็จแล้ว! ฉันคิดว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจาก (ก) เป็นโค้ดเพียงสามบรรทัดเท่านั้นที่ทำงานได้อย่างสวยงามและ (b) คำตอบเพียงไม่กี่คำจะทำการแปลจาก JSONArray เป็น List <CustomObject> ขอบคุณ!
John Ward

ต้องเป็น JSONArray ดูเหมือนว่า JSONElement จะไม่ทำงาน ดังนั้นให้ใช้getAsJsonArray()วิธีนี้ให้ชัดเจน ขอบคุณ!
嘉恒陶

1
สิ่งที่ฉันต้องการขอบคุณ! หมายเหตุ: คุณต้องนำเข้าสิ่งเหล่านี้: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H

ยอดเยี่ยมนี่น่าจะเป็นคำตอบที่ยอมรับ!. ขอบคุณ
Yeuni

สิ่งนี้ใช้ไม่ได้โดยบอกว่า init of typetoken ได้รับการป้องกัน
nikoss

7

ลองวิธีนี้เพียงวนลูปสร้างอาร์เรย์ของคุณเอง โค้ดนี้ถือว่าเป็นอาร์เรย์ของสตริงไม่ควรยากที่จะแก้ไขให้เหมาะกับโครงสร้างอาร์เรย์เฉพาะของคุณ

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );

6

แทนที่จะแปลงสตริง JSON เป็น ArrayList หรือแม้แต่ Map คุณสามารถสร้างJSONObjectเองได้ วัตถุนี้มีความสามารถในการได้รับค่าสตริงโดยคีย์ตามที่คุณต้องการและยังสามารถที่จะเอาวัตถุ

เพื่อสร้างJSONObjectจากสตริง JSON รูปแบบถูกต้องคุณก็โทรคอนสตรัคที่เหมาะสม

JSONObject json = new JSONObject(jsonString);

1
ปัญหาที่ฉันพบกับโซลูชันนี้โดยเฉพาะคือเมื่อจัดการกับ JSONObject และ JSONArray คือพวกเขาโยน JSONException บางครั้งการส่งผ่านเนื้อหาของ JSONArray ไปยังฟังก์ชันที่ไม่จำเป็นต้องทราบ JSON ก็เป็นเรื่องสะดวก
Aaron Dougherty

2
ฉันเห็นด้วย. ฉันจะใช้ JSONObject เป็นส่วนหนึ่งของการแยกวิเคราะห์ข้อความ JSON เป็นอ็อบเจ็กต์โมเดลที่ใช้งานได้ JSONException ใด ๆ ที่เพิ่มขึ้นจะบ่งบอกถึงปัญหากับ JSON ต้นทางซึ่งหมายความว่าคุณไม่สามารถแยกวิเคราะห์ลงใน JSONArray หรือ JSONObject ได้นับประสาอะไรกับโมเดลออบเจ็กต์อื่น
brianestey

6

ฉันมีวิธีแก้ปัญหาอย่างรวดเร็ว เพียงแค่สร้างไฟล์ArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

การใช้งาน:

ArrayList<Object> list = ArrayUtil.convert(jArray);

หรือ

JSONArray jArr = ArrayUtil.convert(list);

ฉันจะทำอย่างไรหากจำเป็นต้องส่งคืนArrayList<String>

ฉันคิดว่ามันเป็นไปไม่ได้ที่จะส่ง ArrayList <Object> ไปยัง ArrayList <String>
Vasilii Suricov

1
ชื่นชมกับคำตอบนี้ คุณแก้ไขวันของฉัน! ฉันใช้เวลา 2 ชั่วโมงในการพยายามแก้ไขปัญหานี้ จริงๆแล้วปัญหาของฉันคือฉันต้องการใส่รายการที่แปลงJSONArrayเป็นรายการเพื่อที่ฉันจะได้ใส่Listใน a HashMapดังนั้นยูทิลนี้ก็ใช้ได้ดีสำหรับฉัน ขอบคุณ @Vasilii Suricov
Jose Mhlanga

5

ใน Java 8

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

1
ปัญหาเดียวของสิ่งนี้คือ JSONArray.getString (... ) แสดงข้อยกเว้นที่ต้องจัดการภายในการแม็ปดังนั้นคุณจึงจบลงด้วยList<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());สิ่งที่ไม่หรูหราอีกต่อไป งั้นฉันจะไปกับ foreach :)
LazR

นี่เป็นคำตอบที่ดีที่สุดที่นี่ (imho) แต่จะสวยงามหากมีวิธีที่ไม่จำเป็นต้องเข้าถึงข้อมูลอ้างอิง jsonArray มากกว่าหนึ่งครั้ง
djangofan


2

เพื่อให้สะดวกให้ใช้ POJO

ลองแบบนี้ ..

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);

1

ใช้ Gson

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;

1

หากคุณต้องการแยกข้อมูลในรูปแบบสตริงอาร์เรย์ JSON นี่คือรหัสการทำงานของฉัน เปลี่ยนพารามิเตอร์เป็นข้อมูลของคุณ


ชั้น PoJo

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

ดึงข้อมูลของคุณโดยใช้บรรทัดด้านล่างของรหัส

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

มันจะส่งคืน List of PoJo class object ให้คุณ



0
public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
        throws JSONException {
  ArrayList<JSONObject> jsonObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           jsonObjects.add(array.getJSONObject(i++))
       );
  return jsonObjects;
}

0

ฉันมีวิธีแก้ปัญหาอย่างรวดเร็ว เพียงแค่สร้างไฟล์ArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

การใช้งาน:

ArrayList<Object> list = ArrayUtil.convert(jArray);

หรือ

JSONArray jArr = ArrayUtil.convert(list);

0

ตัวแปรทั่วไป

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

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

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));


0

เพียงดำเนินการตามหัวข้อดั้งเดิมของเธรด:

การแปลง jsonarray เป็นรายการ (ใช้ jackson jsonarray และ object mapper ที่นี่):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

0

ทางเลือก Java 8 ที่ง่ายกว่า:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.