Existe uma maneira de converter JSON Array para Java Array normal para ligação de dados Android ListView?
Existe uma maneira de converter JSON Array para Java Array normal para ligação de dados Android ListView?
Respostas:
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)
retorna nulo (como resultado da análise:) [ "String 1", null, "String 2" ]
? Seu crash for-loop não seria então?
size()
vez de length()
.
Se você ainda não possui um objeto JSONArray, chame
JSONArray jsonArray = new JSONArray(jsonArrayString);
Em seguida, basta percorrer isso, criando sua própria matriz. Esse código assume que é uma matriz de seqüências de caracteres, não deve ser difícil de modificar para se adequar à sua estrutura de matriz específica.
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
list.add( jsonArray.getString(i) );
}
Talvez seja apenas uma solução alternativa (não muito eficiente), mas você poderia fazer algo assim:
String[] resultingArray = yourJSONarray.join(",").split(",");
Obviamente, você pode alterar o ,
separador ' ' com o que quiser (eu tinha um JSONArray
endereço de email)
Use pode usar um em String[]
vez de um ArrayList<String>
:
Reduzirá a sobrecarga de memória que um ArrayList possui
Espero que ajude!
String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
parametersArray[i] = parametersJSONArray.getString(i);
}
Usando o Java Streams, você pode apenas usar um IntStream
mapeamento dos objetos:
JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
.mapToObj(array::get)
.map(Object::toString)
.collect(Collectors.toList());
Eu sei que essa pergunta é sobre JSONArray, mas aqui está um exemplo que eu achei útil onde você não precisa usar o JSONArray para extrair objetos do 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);
}
}
Funciona também com matriz de strings
Aqui está uma maneira melhor de fazer isso: se você estiver obtendo os dados da API. PARSE o JSON e carregue-o na sua lista:
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();
...
começando da conversão [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;
}
Em seguida, crie uma versão genérica substituindo array.getJSONObject (i ++) por POJO
exemplo:
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;
}
Você pode usar um em String[]
vez de um ArrayList<String>
:
Espero que ajude!
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;
}
Podemos simplesmente converter o JSON em string legível e dividi-lo usando o método "split" da classe 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("\",\"");
Eu sei que a pergunta era para Java
. Mas quero compartilhar uma solução possível, Kotlin
porque acho que é útil.
Com o Kotlin, você pode escrever uma função de extensão que converte a JSONArray
em uma matriz nativa (Kotlin):
fun JSONArray.asArray(): Array<Any> {
return Array(this.length()) { this[it] }
}
Agora você pode ligar asArray()
diretamente em uma JSONArray
instância.
Que tal usar o java.util.Arrays?
List<String> list = Arrays.asList((String[])jsonArray.toArray())
toArray()
método nos JSONArray()
documentos. json.org/javadoc/org/json/JSONArray.html Esta pergunta provavelmente não teria sido feita se houvesse uma simples toArray()
.
org.JSONArray
usa um ArrayList sob o capô ...The arrayList where the JSONArray's properties are kept
, então a maioria looping é feito para nada, em muitos casos (apenas para o encapsulamento)