Есть ли способ преобразовать массив JSON в обычный массив Java для привязки данных Android ListView?
Есть ли способ преобразовать массив JSON в обычный массив Java для привязки данных Android ListView?
Ответы:
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)вернет значение null (в результате синтаксического анализа this :) [ "String 1", null, "String 2" ]? Разве тогда не вылетит ваш цикл for?
size()вместо length().
Если у вас еще нет объекта JSONArray, вызовите
JSONArray jsonArray = new JSONArray(jsonArrayString);
Затем просто пропустите это, создав свой собственный массив. Этот код предполагает, что это массив строк, который не составит труда изменить в соответствии с вашей конкретной структурой массива.
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
list.add( jsonArray.getString(i) );
}
Возможно, это всего лишь обходной путь (не очень эффективный), но вы можете сделать что-то вроде этого:
String[] resultingArray = yourJSONarray.join(",").split(",");
Очевидно, вы можете изменить ,разделитель на что угодно (у меня был JSONArrayадрес электронной почты)
Используйте String[]вместо ArrayList<String>:
Это уменьшит накладные расходы на память, которые имеет ArrayList.
Надеюсь, поможет!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
Используя Java Streams, вы можете просто использовать IntStreamотображение объектов:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
Я знаю, что этот вопрос касается JSONArray, но вот пример, который я нашел полезным, когда вам не нужно использовать JSONArray для извлечения объектов из 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);
}
}
Работает также с массивом строк
Вот лучший способ сделать это: если вы получаете данные из API. Затем РАЗБИРАЙТЕ JSON и загружайте его в свой список:
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();
...
мы начинаем с преобразования [JSONArray -> List <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;
}
затем создайте общую версию, заменив array.getJSONObject (i ++) на POJO
пример :
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;
}
Вы можете использовать String[]вместо ArrayList<String>:
Надеюсь, поможет!
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;
}
Мы можем просто преобразовать JSON в читаемую строку и разделить ее с помощью метода «split» класса 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("\",\"");
Я знаю, что вопрос был за Java. Но я хочу поделиться возможным решением, Kotlinпотому что считаю его полезным.
С помощью Kotlin вы можете написать функцию расширения, которая преобразует JSONArrayмассив в собственный (Kotlin) массив:
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
Теперь вы можете asArray()напрямую обращаться к JSONArrayэкземпляру.
Как насчет использования java.util.Arrays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
toArray()метода в JSONArray()документации. json.org/javadoc/org/json/JSONArray.html Этот вопрос, вероятно, не задавали бы, если бы существовал простой toArray().
org.JSONArrayпод капотом используется ArrayList ...The arrayList where the JSONArray's properties are kept, поэтому большинство циклов во многих случаях выполняется даром (только для инкапсуляции)