chuyển đổi ArrayList <MyCustomClass> thành JSONArray


115

Tôi có ArrayList mà tôi sử dụng trong ArrayAdapter cho ListView. Tôi cần lấy các mục trong danh sách và chuyển đổi chúng thành JSONArray để gửi tới API. Tôi đã tìm kiếm xung quanh, nhưng không tìm thấy bất kỳ điều gì giải thích cách điều này có thể hoạt động, mọi sự trợ giúp sẽ được đánh giá cao.

CẬP NHẬT - GIẢI PHÁP

Đây là những gì tôi đã làm để giải quyết vấn đề.

Đối tượng trong ArrayList:

public class ListItem {
    private long _masterId;
    private String _name;
    private long _category;

    public ListItem(long masterId, String name, long category) {
        _masterId = masterId;
        _name = name;
        _category = category;
    }

    public JSONObject getJSONObject() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("Id", _masterId);
            obj.put("Name", _name);
            obj.put("Category", _category);
        } catch (JSONException e) {
            trace("DefaultListItem.toString JSONException: "+e.getMessage());
        }
        return obj;
    }
}

Đây là cách tôi chuyển đổi nó:

ArrayList<ListItem> myCustomList = .... // list filled with objects
JSONArray jsonArray = new JSONArray();
for (int i=0; i < myCustomList.size(); i++) {
        jsonArray.put(myCustomList.get(i).getJSONObject());
}

Và đầu ra:

[{"Name":"Name 1","Id":0,"Category":"category 1"},{"Name":"Name 2","Id":1,"Category":"category 2"},{"Name":"Name 3","Id":2,"Category":"category 3"}]

Hy vọng điều này sẽ giúp ai đó một ngày nào đó!

Câu trả lời:


115

Nếu tôi đọc đúng các hàm tạo JSONArray, bạn có thể tạo chúng từ bất kỳ Bộ sưu tập nào (arrayList là một lớp con của Bộ sưu tập) như sau:

ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("baar");
JSONArray jsArray = new JSONArray(list);

Người giới thiệu:


3
Điều đó hoạt động trong ví dụ của bạn, nhưng trong ArrayList của tôi bao gồm các Đối tượng chứ không phải Chuỗi - đoán rằng tôi nên đặt điều đó trong câu hỏi của mình. Tôi nghĩ đây là hướng đi đúng, nhưng tôi có thể cần ghi đè toString trong lớp của mình để làm cho nó hoạt động chính xác.
pmko

1
Bạn luôn có thể lặp lại danh sách của mình và sử dụng jsArray.put () cho việc này. Cuối cùng, các đối tượng của bạn nên có một phương thức toString để chúng được chuyển đổi thành JSONArray, tôi nghĩ vậy, vì chúng sẽ được lưu thành một.
Nanne

3
Điều đó khiến tôi kết thúc, nhưng điều đã xảy ra là đầu ra toString () từ mỗi đối tượng đã được chèn vào JSONArray dưới dạng một Chuỗi. Tôi vẫn kết thúc với một JSONArray của chuỗi chứ không phải đối tượng. Tôi đã kết thúc việc tạo một phương thức trên lớp của mình có tên là getJSONObject, sau đó lặp qua ArrayList và đưa kết quả của điều này vào JSONArray. Cảm ơn vì đã đưa tôi đi đúng đường. Tôi sẽ chấp nhận câu trả lời của bạn và sau đó đăng một mẫu mã về những gì tôi đã làm. tôi hy vọng đây không phải là nghi thức SO xấu.
pmko

64

Sử dụng thư viện Gson để chuyển đổi ArrayList sang JsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();

5
Đây không phải là org.json.JSONArray như OP muốn, nó là com.google.gson.JsonArray.
nima

một Id khác đã nộp được thêm thơm trong khi sử dụng Gson.toJsonTree. cách phòng tránh.
Hitesh Kamani

@HiteshKamani Nó sẽ không tự động thêm id bổ sung, có thể là lớp của bạn đang có trường id.
Purushotham

Nó thực sự phụ thuộc vào nhiệm vụ. Nói chung không có giá trị bao gồm toàn bộ thư viện bên ngoài để thực hiện những thứ mà Android SDK có thể phù hợp với chính nó. Đặc biệt nếu bạn đang ở rìa của các phương pháp 64K trong dự án.
Maxim Berezovsky

1
hi Uttam giải pháp tuyệt vời chỉ là một điều nhanh chóng nó không chuyển đổi ArrayList trong ArrayList để mảng json
Aashish Bhatnagar

35

Khi ai đó phát hiện ra rằng OP muốn chuyển đổi Danh sách tùy chỉnh thành org.json.JSONArraykhông phải com.google.gson.JsonArray, câu trả lời ĐÚNG sẽ như sau:

Gson gson = new Gson();

String listString = gson.toJson(
                    targetList,
           new TypeToken<ArrayList<targetListItem>>() {}.getType());

 JSONArray jsonArray =  new JSONArray(listString);

Tuyệt vời :) Bạn là hoàn hảo
Pratik Butani

@zionpi đây 2 thư viện đang được sử dụng để chuyển đổi một danh sách mảng vào mảng Json
Purushotham

@Uttam Bạn có thể thấy hai lib được sử dụng trong này ở đâu?
Ravi Yadav

Nếu am I correct, JSONArray là từ org.json và Gson là từ com.google.json
Purushotham

Gah điều này ném ngoại lệ đã kiểm tra: JSONException. Nếu không thì câu trả lời hoàn hảo ngay tại đây.
Babken Vardanyan

5
public void itemListToJsonConvert(ArrayList<HashMap<String, String>> list) {

        JSONObject jResult = new JSONObject();// main object
        JSONArray jArray = new JSONArray();// /ItemDetail jsonArray

        for (int i = 0; i < list.size(); i++) {
            JSONObject jGroup = new JSONObject();// /sub Object

            try {
                jGroup.put("ItemMasterID", list.get(i).get("ItemMasterID"));
                jGroup.put("ID", list.get(i).get("id"));
                jGroup.put("Name", list.get(i).get("name"));
                jGroup.put("Category", list.get(i).get("category"));

                jArray.put(jGroup);

                // /itemDetail Name is JsonArray Name
                jResult.put("itemDetail", jArray);
                return jResult;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }

2
Đây là một trong những lý do tại sao tôi trở thành một lập trình viên lười biếng. Tôi nhận được mã kích thước viên nang để thực hiện mọi việc từ SOF. Sao chép dán và mọi thứ hoạt động. Wonder khi tôi sẽ được thay thế bởi một robot mà không giống hệt nhau ...
Subin Sebastian

1

Tôi biết nó đã được trả lời, nhưng có một giải pháp tốt hơn ở đây là sử dụng mã này:

for ( Field f : context.getFields() ) {
     if ( f.getType() == String.class ) || ( f.getType() == String.class ) ) {
           //DO String To JSON
     }
     /// And so on...
}

Bằng cách này, bạn có thể truy cập các biến từ lớp mà không cần nhập thủ công ..

Nhanh hơn và tốt hơn .. Hy vọng điều này sẽ giúp.

Chúc mừng. : D


1

Thêm vào gradle của bạn:

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

Chuyển đổi ArrayListsangJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);

0

Với kotlin và Gson, chúng ta có thể làm điều đó dễ dàng hơn:

  1. Đầu tiên, thêm phụ thuộc Gson:

implementation "com.squareup.retrofit2:converter-gson:2.3.0"

  1. Tạo một kotlintệp riêng biệt , thêm các phương pháp sau
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

fun <T> Gson.convertToJsonString(t: T): String {
    return toJson(t).toString()
}

fun <T> Gson.convertToModel(jsonString: String, cls: Class<T>): T? {
    return try {
        fromJson(jsonString, cls)
    } catch (e: Exception) {
        null
    }
}

inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)

Lưu ý: Không thêm lớp khai báo, chỉ cần thêm các phương thức này, mọi thứ sẽ hoạt động tốt.

  1. Bây giờ để gọi:

tạo một tham chiếu của gson:

val gson = Gson ()

Để chuyển đổi mảng thành chuỗi json, hãy gọi :

val jsonString=gson.convertToJsonString(arrayList)

Để lấy mảng từ chuỗi json, hãy gọi :

val arrayList=gson.fromJson<ArrayList<YourModelClassName>>(jsonString)

Để chuyển đổi một mô hình thành chuỗi json, hãy gọi:

val jsonString=gson.convertToJsonString(model)

Để chuyển đổi chuỗi json thành mô hình, hãy gọi:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
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.