Gibt es eine Möglichkeit, ein JSON-Array in ein normales Java-Array für die ListView-Datenbindung von Android zu konvertieren?
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());
}
}
Wenn Sie noch kein JSONArray-Objekt haben, rufen Sie auf
JSONArray jsonArray = new JSONArray(jsonArrayString);
Dann durchlaufen Sie das einfach und bauen ein eigenes Array auf. Bei diesem Code wird davon ausgegangen, dass es sich um ein Array von Strings handelt. Es sollte nicht schwierig sein, diese an Ihre Arraystruktur 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 Umgehung (nicht sehr effizient), aber Sie könnten so etwas tun:
String[] resultingArray = yourJSONarray.join(",").split(",");
Natürlich können Sie das Trennzeichen ",
" beliebig ändern (ich hatte eine JSONArray
E-Mail-Adresse).
Anstelle der gebündelten org.json
-Bibliothek verwenden Sie entweder Jackson oder GSON, wobei dies ein Einzeiler ist. Mit Jackson, zB:
List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
Verwenden Sie einen String[]
anstelle eines ArrayList<String>
:
Dadurch wird der Speicheraufwand verringert, den eine ArrayList hat
Ich hoffe es hilft!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
Sie können einen String[]
anstelle eines ArrayList<String>
verwenden:
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;
}
Hier ist eine bessere Möglichkeit, dies zu tun: Wenn Sie die Daten von der API erhalten Dann PARSE die JSON und lade sie 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();
...
Ich weiß, dass es sich bei dieser Frage um JSONArray handelt, aber hier ein Beispiel, das ich für nützlich befunden habe, wenn Sie nicht JSONArray verwenden müssen, um Objekte aus JSONObject zu extrahieren.
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 Strings
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 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;
}
erstellen Sie als Nächstes 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;
}
Mit Java Streams können Sie einfach IntStream
verwenden, um die Objekte zuzuordnen:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
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("\",\"");