Забавно то, что org.JSONArrayпод капотом используется ArrayList ... The arrayList where the JSONArray's properties are kept, поэтому большинство циклов во многих случаях выполняется даром (только для инкапсуляции)
Кристоф Русси,
Ответы:
186
ArrayList<String> list =newArrayList<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());}}
В цикле for отсутствует закрывающая скобка ... пробовал редактировать, но недостаточно символов для утверждения. Ну что ж! просто к вашему сведению.
Matt K
на самом деле это не пропало, ответчик просто вставил кусок кода с открывающей и закрывающей фигурными скобками функции.
Сарим Джавид Хан
1
Что произойдет, если jsonArray.get(i)вернет значение null (в результате синтаксического анализа this :) [ "String 1", null, "String 2" ]? Разве тогда не вылетит ваш цикл for?
dbm
Спасибо. Если есть sring, то JSONArray может быть создан как JSONArray jsonArray = new JSONArray (yourString); остальная часть кода останется прежней.
Kaushik Lele
В зависимости от реализации вам может понадобиться size()вместо length().
Затем просто пропустите это, создав свой собственный массив. Этот код предполагает, что это массив строк, который не составит труда изменить в соответствии с вашей конкретной структурой массива.
List<String> list =newArrayList<String>();for(int i=0; i<jsonArray.length(); i++){
list.add( jsonArray.getString(i));}
Я знаю, что этот вопрос касается JSONArray, но вот пример, который я нашел полезным, когда вам не нужно использовать JSONArray для извлечения объектов из 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);}}
мы начинаем с преобразования [JSONArray -> List <JSONObject>]
publicstaticList<JSONObject> getJSONObjectListFromJSONArray(JSONArray array)throwsJSONException{ArrayList<JSONObject> jsonObjects =newArrayList<>();for(int i =0;
i <(array !=null? array.length():0);
jsonObjects.add(array.getJSONObject(i++)));return jsonObjects;}
затем создайте общую версию, заменив array.getJSONObject (i ++) на POJO
пример :
public<T>staticList<T> getJSONObjectListFromJSONArray(Class<T> forClass,JSONArray array)throwsJSONException{ArrayList<Tt> tObjects =newArrayList<>();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;}
Мы можем просто преобразовать JSON в читаемую строку и разделить ее с помощью метода «split» класса 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("\",\"");
Я не вижу toArray()метода в JSONArray()документации. json.org/javadoc/org/json/JSONArray.html Этот вопрос, вероятно, не задавали бы, если бы существовал простой toArray().
javajavajavajavajava
1
net.sf.json.JSONArray имеет метод toArray (), поэтому этот ответ работает для этой библиотеки JSON. В вопросе не указана используемая библиотека.
org.JSONArray
под капотом используется ArrayList ...The arrayList where the JSONArray's properties are kept
, поэтому большинство циклов во многих случаях выполняется даром (только для инкапсуляции)Ответы:
источник
jsonArray.get(i)
вернет значение null (в результате синтаксического анализа this :)[ "String 1", null, "String 2" ]
? Разве тогда не вылетит ваш цикл for?size()
вместоlength()
.Если у вас еще нет объекта JSONArray, вызовите
Затем просто пропустите это, создав свой собственный массив. Этот код предполагает, что это массив строк, который не составит труда изменить в соответствии с вашей конкретной структурой массива.
источник
Вместо использования
org.json
встроенной библиотеки попробуйте использовать Jackson или GSON, где это однострочный. С Джексоном, например:источник
Возможно, это всего лишь обходной путь (не очень эффективный), но вы можете сделать что-то вроде этого:
String[] resultingArray = yourJSONarray.join(",").split(",");
Очевидно, вы можете изменить
,
разделитель на что угодно (у меня былJSONArray
адрес электронной почты)источник
Используйте
String[]
вместоArrayList<String>
:Это уменьшит накладные расходы на память, которые имеет ArrayList.
Надеюсь, поможет!
источник
Используя Java Streams, вы можете просто использовать
IntStream
отображение объектов:источник
Я знаю, что этот вопрос касается JSONArray, но вот пример, который я нашел полезным, когда вам не нужно использовать JSONArray для извлечения объектов из JSONObject.
Работает также с массивом строк
источник
Вот лучший способ сделать это: если вы получаете данные из API. Затем РАЗБИРАЙТЕ JSON и загружайте его в свой список:
источник
мы начинаем с преобразования [JSONArray -> List <JSONObject>]
затем создайте общую версию, заменив array.getJSONObject (i ++) на POJO
пример :
источник
Вы можете использовать
String[]
вместоArrayList<String>
:Надеюсь, поможет!
источник
источник
Мы можем просто преобразовать JSON в читаемую строку и разделить ее с помощью метода «split» класса String.
источник
Я знаю, что вопрос был за
Java
. Но я хочу поделиться возможным решением,Kotlin
потому что считаю его полезным.С помощью Kotlin вы можете написать функцию расширения, которая преобразует
JSONArray
массив в собственный (Kotlin) массив:Теперь вы можете
asArray()
напрямую обращаться кJSONArray
экземпляру.источник
Как насчет использования java.util.Arrays?
источник
toArray()
метода вJSONArray()
документации. json.org/javadoc/org/json/JSONArray.html Этот вопрос, вероятно, не задавали бы, если бы существовал простойtoArray()
.