Czy istnieje sposób na przekonwertowanie tablicy JSON na normalną tablicę Java dla powiązania danych ListView systemu Android?
Czy istnieje sposób na przekonwertowanie tablicy JSON na normalną tablicę Java dla powiązania danych ListView systemu Android?
Odpowiedzi:
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)zwróci wartość null (w wyniku analizy tego:) [ "String 1", null, "String 2" ]? Czy wtedy twoja pętla for-loop nie uległaby awarii?
size()zamiast length().
Jeśli nie masz jeszcze obiektu JSONArray, zadzwoń
JSONArray jsonArray = new JSONArray(jsonArrayString);
Następnie po prostu zapętl to, tworząc własną tablicę. Ten kod zakłada, że jest to tablica ciągów, nie powinno być trudno ją zmodyfikować, aby pasowała do konkretnej struktury tablicy.
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
list.add( jsonArray.getString(i) );
}
Może to tylko obejście (niezbyt wydajne), ale możesz zrobić coś takiego:
String[] resultingArray = yourJSONarray.join(",").split(",");
Oczywiście możesz zmienić ,separator „ ” na cokolwiek chcesz (miałem JSONArrayadresy e-mail)
Użyj String[]zamiast ArrayList<String>:
Zmniejszy to obciążenie pamięci, które ma ArrayList
Mam nadzieję, że to pomoże!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
Korzystając ze strumieni Java, możesz po prostu użyć IntStreammapowania obiektów:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
Wiem, że pytanie dotyczy JSONArray, ale oto przykład, który uważam za przydatny, gdy nie trzeba używać JSONArray do wyodrębniania obiektów z 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);
}
}
Działa również z tablicą ciągów
Oto lepszy sposób na zrobienie tego: jeśli otrzymujesz dane z interfejsu API. Następnie PARSE JSON i załaduj go do widoku listy:
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();
...
zaczynamy od konwersji [JSONArray -> Lista <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;
}
Następnie utwórz wersję ogólną, zastępując array.getJSONObject (i ++) przez POJO
przykład:
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;
}
Możesz użyć String[]zamiast ArrayList<String>:
Mam nadzieję, że to pomoże!
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;
}
Możemy po prostu przekonwertować JSON na czytelny ciąg znaków i podzielić go metodą „split” klasy 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("\",\"");
Wiem, że to pytanie Java. Ale chcę podzielić się możliwym rozwiązaniem, Kotlinponieważ uważam, że jest przydatne.
Za pomocą Kotlin możesz napisać funkcję rozszerzającą, która konwertuje a JSONArrayna tablicę natywną (Kotlin):
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
Teraz możesz dzwonić asArray()bezpośrednio do JSONArrayinstancji.
Co powiesz na używanie java.util.Arrays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
toArray()metody w JSONArray()dokumentacji. json.org/javadoc/org/json/JSONArray.html To pytanie prawdopodobnie nie zostałoby zadane, gdyby istniało proste toArray().
org.JSONArrayużywa ArrayList pod maską ...The arrayList where the JSONArray's properties are kept, więc większość pętli jest wykonywana na nic w wielu przypadkach (tylko w celu hermetyzacji)