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?
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?
Câu trả lời:
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());
}
}
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 đó?
size()
thay vì length()
.
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) );
}
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)
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);
}
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());
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
Đâ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();
...
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;
}
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;
}
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;
}
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("\",\"");
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 Kotlin
vì 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 JSONArray
thà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 JSONArray
ví dụ.
Làm thế nào về việc sử dụng java.util.Arays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
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()
.
org.JSONArray
sử 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)