Zabawne jest to, że 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)
Christophe Roussy
Odpowiedzi:
187
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());
}
}
W pętli for brakuje nawiasu zamykającego ... próbowano edytować, ale nie ma wystarczającej liczby znaków do zatwierdzenia. No cóż! tylko do Twojej wiadomości.
Matt K
tak naprawdę nie brakuje, odpowiadający właśnie wkleił fragment kodu z nawiasami otwierającymi i zamykającymi funkcji.
Sarim Javaid Khan
1
Co się stanie, jeśli 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?
dbm
Dzięki. Jeśli ktoś ma sring, to JSONArray można utworzyć jako JSONArray jsonArray = new JSONArray (yourString); reszta kodu pozostanie taka sama.
Kaushik Lele
W zależności od implementacji możesz potrzebować size()zamiast length().
Guillaume F.
59
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) );
}
Pamiętaj, że musisz mieć absolutną pewność, że dane nie zawierają znaku separatora, w przeciwnym razie skończysz z uszkodzonymi danymi.
Artemix
1
a wynik musi być ciągiem.
Nicolas Tyler,
4
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);
}
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);
}
}
zaczynamy od konwersji [JSONArray -> Lista <JSONObject>]
publicstatic 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;
}
privatestatic 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ż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("\",\"");
Nie widzę toArray()metody w JSONArray()dokumentacji. json.org/javadoc/org/json/JSONArray.html To pytanie prawdopodobnie nie zostałoby zadane, gdyby istniało proste toArray().
javajavajavajavajava
1
net.sf.json.JSONArray ma metodę toArray (), więc ta odpowiedź działa dla tej biblioteki JSON. Pytanie nie określało używanej biblioteki.
org.JSONArray
uż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)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()); } }
źródło
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()
zamiastlength()
.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) ); }
źródło
Zamiast korzystać z dołączonej
org.json
biblioteki, spróbuj użyć Jacksona lub GSON, gdzie jest to jedna linijka. Z Jacksonem, np.List<String> list = new ObjectMapper().readValue(json, List.class); // Or for array: String[] array = mapper.readValue(json, String[].class);
źródło
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łemJSONArray
adresy e-mail)źródło
Użyj
String[]
zamiastArrayList<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); }
źródło
Korzystając ze strumieni Java, możesz po prostu użyć
IntStream
mapowania obiektów:JSONArray array = new JSONArray(jsonString); List<String> result = IntStream.range(0, array.length()) .mapToObj(array::get) .map(Object::toString) .collect(Collectors.toList());
źródło
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
źródło
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(); ...
źródło
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; }
źródło
Możesz użyć
String[]
zamiastArrayList<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; }
źródło
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; }
źródło
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("\",\"");
źródło
Wiem, że to pytanie
Java
. Ale chcę podzielić się możliwym rozwiązaniem,Kotlin
ponieważ uważam, że jest przydatne.Za pomocą Kotlin możesz napisać funkcję rozszerzającą, która konwertuje a
JSONArray
na tablicę natywną (Kotlin):fun JSONArray.asArray(): Array<Any> { return Array(this.length()) { this[it] } }
Teraz możesz dzwonić
asArray()
bezpośrednio doJSONArray
instancji.źródło
Co powiesz na używanie java.util.Arrays?
źródło
toArray()
metody wJSONArray()
dokumentacji. json.org/javadoc/org/json/JSONArray.html To pytanie prawdopodobnie nie zostałoby zadane, gdyby istniało prostetoArray()
.