Chuyển đổi JSONarray thành ArrayList


104

Tôi đang tải xuống một chuỗi JSON và chuyển đổi nó thành JSONArray. Tôi đang đưa nó vào một listview và cần có thể xóa khỏi listview đó sau này và vì JSONArray không có phương thức .remove (Cảm ơn Obama), nên tôi đang cố gắng chuyển nó thành một danh sách mảng.

đây là JSON của tôi (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"}]

Tôi cần đưa nó vào một mảng và có thể gọi các chuỗi bằng các khóa tương ứng của chúng. Đánh giá cao sự giúp đỡ!


Khi bạn nói phím, điều đó có ngụ ý một Từ điển (Bản đồ trong Android) thuộc một loại nào đó không? Một mảng sẽ dựa trên chỉ mục. Hãy xem developer.android.com/reference/java/util/Map.html để biết cách tạo và sử dụng.
brianestey

Bản đồ có thể được sử dụng để điền một chế độ xem danh sách với một bản ghi cơ sở tùy chỉnh không? Tôi thay vì sử dụng các chỉ mục trong trường hợp JSON thay đổi thứ tự.
TheGeekNess

ListView sẽ lấy các đối tượng từ bộ điều hợp theo chỉ mục, vì vậy trong mọi trường hợp, bạn sẽ cần duy trì danh sách theo một số thứ tự. Nếu bạn muốn duy trì thứ tự của các khóa (và biết các khóa là gì tại thời điểm biên dịch), bạn có thể mã hóa một mảng các khóa đó theo thứ tự bạn thích và sử dụng nó cho thứ tự của bạn khi tìm nạp từ Bản đồ.
brianestey

Câu trả lời:


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));nếu dữ liệu danh sách của bạn là một arrayList JSONObject. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian

2
Đoạn trích hay. Chỉ trong trường hợp nếu có ai muốn: có một lớp helper cải JSONObject / JSONArray đến một bản đồ / Danh sách tiêu chuẩn trên github gist.github.com/codebutler/2339666
inexcii

2
Tại sao không sử dụng một ArrayList<Object>?
natanavra

Làm cách nào để xử lý Mảng Json trống. vui lòng trả lời tôi anh bạn.
MohanRaj S

3
Có cách nào khác để làm điều này mà không cần vòng lặp không?
K.Sopheak

64

Tôi đã thực hiện nó bằng cách sử dụng Gson(của Google) .

Thêm dòng sau vào mô-đun của bạn 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 chuỗi:

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

Mã để chuyển đổi một chuỗi JSON thành ArrayList<Model> :

Lưu ý: Bạn phải nhập 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);
    }
}

Hy vọng điều này sẽ giúp bạn.


4
BA DÒNG ... XONG! Tôi nghĩ đây phải là câu trả lời được chấp nhận vì (a) nó chỉ có ba dòng mã hoạt động tốt và (b) một số câu trả lời thực sự thực hiện một bản dịch đã nhập từ JSONArray sang List <CustomObject>. Cảm ơn bạn!
John Ward

Nó phải là một JSONArray, JSONElement có vẻ không hoạt động. vì vậy, hãy sử dụng getAsJsonArray()phương pháp này một cách xuất hiện. Cảm ơn bạn!
嘉 恒 陶

1
Chính xác những gì tôi cần, cảm ơn! Lưu ý: Bạn phải nhập các tệp này: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H

Tuyệt vời, Đây lẽ ra phải là câu trả lời được chấp nhận !. Cảm ơn
Yeuni

điều này không làm việc nói init của typetoken được bảo vệ
nikoss

7

hãy thử cách này Đơn giản chỉ cần lặp qua đó, xây dựng mảng của riêng bạn. Mã này giả định rằng đó là một mảng chuỗi, không khó để sửa đổi cho phù hợp với cấu trúc mảng cụ thể của bạn.

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

Thay vì chuyển đổi chuỗi JSON thành ArrayList hoặc thậm chí là Bản đồ, bạn chỉ có thể tạo chính một JSONObject . Đối tượng này có khả năng nhận các giá trị chuỗi theo khóa , như bạn muốn và cũng có thể xóa các đối tượng .

Để tạo một JSONObjecttừ một chuỗi JSON được định dạng đúng, bạn chỉ cần gọi hàm tạo thích hợp .

JSONObject json = new JSONObject(jsonString);

1
Đặc biệt, vấn đề tôi gặp phải với giải pháp này là khi xử lý JSONObject và JSONArray, họ sẽ ném JSONException. Đôi khi, thật tiện lợi khi chuyển nội dung của một JSONArray đến một hàm không cần phải biết về JSON.
Aaron Dougherty

2
Tôi đồng ý. Tôi sẽ sử dụng JSONObject như một phần của quá trình phân tích cú pháp văn bản JSON thành một đối tượng mô hình có thể sử dụng được. Bất kỳ ngoại lệ JSONException nào được nêu ra sẽ chỉ ra sự cố với JSON nguồn, nghĩa là bạn không thể phân tích cú pháp nó thành JSONArray hoặc JSONObject, chưa nói đến một đối tượng mô hình khác.
brianestey

6

Tôi có giải pháp nhanh chóng. Chỉ cần tạo một tệpArrayUtil.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);
    }

}

Sử dụng:

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

hoặc là

JSONArray jArr = ArrayUtil.convert(list);

Tôi phải làm gì nếu cần trả lại aArrayList<String>

Tôi nghĩ rằng không thể truyền ArrayList <Object> thành ArrayList <String>
Vasilii Suricov

1
Kudo cho câu trả lời này. U đã giải quyết ngày của tôi! Tôi đã dành 2 giờ để cố gắng sửa lỗi này. Trên thực tế, vấn đề của tôi là tôi muốn chuyển đổi JSONArraythành một danh sách để tôi có thể đưa Listvào HashMap, vì vậy việc sử dụng này hoạt động khá tốt với tôi. Cảm ơn @Vasilii Suricov
Jose Mhlanga

5

Trong Java 8,

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

1
Vấn đề duy nhất với điều này là JSONArray.getString (...) ném một ngoại lệ phải được xử lý bên trong ánh xạ, vì vậy bạn kết thúc với ngoại lệ đó 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());không còn thanh lịch nữa. Vì vậy, tôi sẽ đi với một foreach :)
LazR

Đây là câu trả lời tốt nhất ở đây (imho) nhưng sẽ rất tuyệt nếu có một cách để không cần truy cập tham chiếu jsonArray nhiều lần.
djangofan

4
 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));

2

Để tiện dụng, hãy sử dụng POJO.

hãy thử như thế này ..

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

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

yourPojos.add(yourPojo);

1

Sử dụng 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

nếu bạn muốn trích xuất dữ liệu dạng chuỗi JSON mảng, đây là mã làm việc của tôi. thay đổi tham số làm dữ liệu của bạn.


Lớp PoJo

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

Trích xuất dữ liệu của bạn bằng dòng mã bên dưới

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

nó sẽ trả về cho bạn Danh sách đối tượng lớp PoJo.


1

Kiểu Java 8

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());

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

Tôi có giải pháp nhanh chóng. Chỉ cần tạo một tệpArrayUtil.java

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

Sử dụng:

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

hoặc là

JSONArray jArr = ArrayUtil.convert(list);

0

Biến thể chung

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
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@giản thể


0

Chỉ đi theo chủ đề ban đầu của chủ đề:

chuyển đổi jsonarray thành danh sách (jsonarray jackson đã sử dụng và trình ánh xạ đối tượng ở đây):

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

0

Một thay thế Java 8 đơn giản hơn:

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());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.