Chuyển đổi Json Array sang danh sách Java bình thường


130

Có cách nào để chuyển đổi JSON Array thành Java Array bình thường để liên kết dữ liệu ListView của Android không?


8
Điều thú vị là org.JSONArraysử dụng một ArrayList dưới mui xe ... The arrayList where the JSONArray's properties are kept, do đó, hầu hết các vòng lặp được thực hiện mà không có gì trong nhiều trường hợp (chỉ cho việc đóng gói)
Barshe Roussy

Câu trả lời:


186
ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
   int len = jsonArray.length();
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
} 

5
cho vòng lặp thiếu dấu ngoặc đơn đóng ... đã thử chỉnh sửa nhưng nó không đủ ký tự để vượt qua phê duyệt. ồ chỉ là một FYI.
Matt K

Thật ra không thiếu, người trả lời chỉ cần dán một đoạn mã với các dấu ngoặc mở và đóng của hàm.
Sarim Javaid Khan

1
Điều gì xảy ra nếu jsonArray.get(i)trả về null (là kết quả của việc phân tích cú pháp này [ "String 1", null, "String 2" ]:)? Sẽ không có sự cố for-loop của bạn sau đó?
dbm

Cảm ơn. Nếu ai đó có sring thì có thể tạo ra JSONArray dưới dạng JSONArray jsonArray = new JSONArray (yourString); phần còn lại của mã sẽ vẫn như cũ.
Kaushik Lele

Tùy thuộc vào việc thực hiện bạn có thể cần size()thay vì length().
Guillaume F.

57

Nếu bạn chưa có đối tượng JSONArray, hãy gọi

JSONArray jsonArray = new JSONArray(jsonArrayString);

Sau đó, chỉ cần lặp qua đó, xây dựng mảng của riêng bạn. Mã này giả định đó là một chuỗi các 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.

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

2
Xin lỗi, bạn nói đúng - Tôi nhầm Danh sách với JSONArrays :) Nó thực sự là JSONArray.length ().
Nick

13

Thay vì sử dụng org.jsonthư viện đi kèm , hãy thử sử dụng Jackson hoặc GSON, trong đó đây là thư viện một lớp. Với Jackson, f.ex:

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);

11

Có thể đó chỉ là một cách giải quyết (không hiệu quả lắm) nhưng bạn có thể làm một cái gì đó như thế này:

String[] resultingArray = yourJSONarray.join(",").split(",");

Rõ ràng bạn có thể thay đổi ,dấu phân cách '' bằng bất cứ thứ gì bạn thích (tôi có một JSONArrayđịa chỉ email)


8
Lưu ý rằng bạn phải hoàn toàn chắc chắn rằng dữ liệu không chứa char phân cách của bạn, nếu không, bạn sẽ kết thúc với dữ liệu bị hỏng.
Artemix

1
và kết quả phải là một chuỗi.
Nicolas Tyler

Một lớp lót, hoàn hảo.
zeeshan

4

Sử dụng có thể sử dụng String[]thay vì ArrayList<String>:

Nó sẽ giảm chi phí bộ nhớ mà ArrayList có

Hy vọng nó giúp!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}

3

Sử dụng Luồng Java, bạn chỉ có thể sử dụng IntStreamánh xạ các đối tượng:

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());

0

Tôi biết câu hỏi đó là về JSONArray nhưng đây là ví dụ tôi thấy hữu ích khi bạn không cần sử dụng JSONArray để trích xuất các đối tượng từ JSONObject.

import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

String jsonStr = "{\"types\":[1, 2]}";
JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
List<Long> list = (List<Long>) json.get("types");
if (list != null) {
    for (Long s : list) {
        System.out.println(s);
    }
}

Cũng hoạt động với mảng chuỗi


0

Đây là một cách tốt hơn để làm điều đó: nếu bạn đang lấy dữ liệu từ API. Sau đó, PARSE JSON và tải nó vào listview của bạn:

protected void onPostExecute(String result) {
                Log.v(TAG + " result);


                if (!result.equals("")) {

                    // Set up variables for API Call
                    ArrayList<String> list = new ArrayList<String>();

                    try {
                        JSONArray jsonArray = new JSONArray(result);

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

                            list.add(jsonArray.get(i).toString());

                        }//end for
                    } catch (JSONException e) {
                        Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                        e.printStackTrace();
                    }


                    adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            // ListView Clicked item index
                            int itemPosition = position;

                            // ListView Clicked item value
                            String itemValue = (String) listView.getItemAtPosition(position);

                            // Show Alert
                            Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                        }
                    });

                    adapter.notifyDataSetChanged();


                        adapter.notifyDataSetChanged();

...

0

chúng tôi bắt đầu từ chuyển đổi [JSONArray -> Danh sách <JSONObject>]

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

tiếp theo tạo phiên bản chung thay thế mảng.getJSONObject (i ++) bằng POJO

thí dụ :

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
        throws JSONException {
  ArrayList<Tt> tObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           tObjects.add( (T) createT(forClass, array.getJSONObject(i++))) 
       );
  return tObjects;
}

private static T createT(Class<T> forCLass, JSONObject jObject) {
   // instantiate via reflection / use constructor or whatsoever 
   T tObject = forClass.newInstance(); 
   // if not using constuctor args  fill up 
   // 
   // return new pojo filled object 
   return tObject;
}

0

Bạn có thể sử dụng String[]thay vì ArrayList<String>:

Hy vọng nó giúp!

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }

0

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }


0

Chúng ta chỉ cần chuyển đổi JSON thành chuỗi có thể đọc được và phân tách nó bằng phương thức "split" của lớp String.

String jsonAsString = yourJsonArray.toString();
//we need to remove the leading and the ending quotes and square brackets
jsonAsString = jsonAsString.substring(2, jsonAsString.length() -2);
//split wherever the String contains ","
String[] jsonAsStringArray = jsonAsString.split("\",\"");

-2

Tôi biết rằng câu hỏi là dành cho Java. Nhưng tôi muốn chia sẻ một giải pháp khả thi Kotlinvì tôi nghĩ nó hữu ích.

Với Kotlin, bạn có thể viết một hàm mở rộng để chuyển đổi JSONArraythành một mảng gốc (Kotlin):

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

Bây giờ bạn có thể gọi asArray()trực tiếp trên một JSONArrayví dụ.


-3

Làm thế nào về việc sử dụng java.util.Arays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())

15
Tôi không thấy một toArray()phương pháp trong các JSONArray()tài liệu. json.org/javadoc/org/json/JSONArray.html Câu hỏi này có lẽ sẽ không được hỏi nếu có đơn giản toArray().
javajavajavajavajava

1
net.sf.json.JSONArray có phương thức toArray () để phản hồi này hoạt động cho thư viện JSON này. Câu hỏi không chỉ định thư viện được sử dụng.
ilinca
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.