Gibt es eine Möglichkeit, JSON Array in normales Java Array für Android ListView Datenbindung zu konvertieren?
Gibt es eine Möglichkeit, JSON Array in normales Java Array für Android ListView Datenbindung zu konvertieren?
Antworten:
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 zurückgegeben wird (als Ergebnis der Analyse von :) [ "String 1", null, "String 2" ]
? Würde Ihre For-Loop dann nicht abstürzen?
size()
anstelle von benötigen length()
.
Wenn Sie noch kein JSONArray-Objekt haben, rufen Sie auf
JSONArray jsonArray = new JSONArray(jsonArrayString);
Führen Sie dann einfach eine Schleife durch und erstellen Sie Ihr eigenes Array. Bei diesem Code wird davon ausgegangen, dass es sich um ein Array von Zeichenfolgen handelt. Es sollte nicht schwierig sein, diese an Ihre spezielle Array-Struktur anzupassen.
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
list.add( jsonArray.getString(i) );
}
Vielleicht ist es nur eine Problemumgehung (nicht sehr effizient), aber Sie könnten so etwas tun:
String[] resultingArray = yourJSONarray.join(",").split(",");
Natürlich können Sie das ,
Trennzeichen nach Belieben ändern (ich hatte eine JSONArray
E-Mail-Adresse).
Verwendung kann ein String[]
anstelle eines verwenden ArrayList<String>
:
Dadurch wird der Speicheraufwand für eine ArrayList reduziert
Ich hoffe es hilft!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
Mit Java Streams können Sie einfach eine IntStream
Zuordnung der Objekte verwenden:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
Ich weiß, dass es sich bei dieser Frage um JSONArray handelt, aber das folgende Beispiel hat sich als nützlich erwiesen, wenn Sie JSONArray nicht zum Extrahieren von Objekten aus JSONObject verwenden müssen.
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);
}
}
Funktioniert auch mit einer Reihe von Zeichenfolgen
Hier ist eine bessere Möglichkeit: Wenn Sie die Daten von der API erhalten. PARSE dann den JSON und lade ihn in deine Listenansicht:
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();
...
wir beginnen mit der Konvertierung [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;
}
Als nächstes erstellen Sie eine generische Version, die array.getJSONObject (i ++) durch POJO ersetzt
Beispiel:
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;
}
Sie können ein String[]
anstelle eines verwenden ArrayList<String>
:
Ich hoffe es hilft!
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;
}
Wir können den JSON einfach in einen lesbaren String konvertieren und ihn mit der "split" -Methode der String-Klasse teilen.
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("\",\"");
Ich weiß, dass die Frage für war Java
. Aber ich möchte eine mögliche Lösung für teilen, Kotlin
weil ich denke, dass es nützlich ist.
Mit Kotlin können Sie eine Erweiterungsfunktion schreiben, die a JSONArray
in ein natives (Kotlin) Array konvertiert :
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
Jetzt können Sie asArray()
eine JSONArray
Instanz direkt aufrufen .
Wie wäre es mit java.util.Arrays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
toArray()
Methode in den JSONArray()
Dokumenten. json.org/javadoc/org/json/JSONArray.html Diese Frage wäre wahrscheinlich nicht gestellt worden, wenn es eine einfache gegeben hätte toArray()
.
org.JSONArray
eine ArrayList unter der Haube verwendet wird ...The arrayList where the JSONArray's properties are kept
, so dass die meisten Schleifen in vielen Fällen umsonst durchgeführt werden (nur für die Kapselung)