Преобразование массива Json в обычный список Java

130

Есть ли способ преобразовать массив JSON в обычный массив Java для привязки данных Android ListView?

Хьюстон у нас проблема
источник
8
Забавно то, что org.JSONArrayпод капотом используется ArrayList ... The arrayList where the JSONArray's properties are kept, поэтому большинство циклов во многих случаях выполняется даром (только для инкапсуляции)
Кристоф Русси,

Ответы:

186
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());
   } 
} 
Pentium10
источник
5
В цикле 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().
Гийом Ф.
57

Если у вас еще нет объекта JSONArray, вызовите

JSONArray jsonArray = new JSONArray(jsonArrayString);

Затем просто пропустите это, создав свой собственный массив. Этот код предполагает, что это массив строк, который не составит труда изменить в соответствии с вашей конкретной структурой массива.

List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
}
Ник
источник
2
Извините, вы правы - я путаю списки с JSONArrays :) Это действительно JSONArray.length ().
Ник
14

Вместо использования org.jsonвстроенной библиотеки попробуйте использовать Jackson или GSON, где это однострочный. С Джексоном, например:

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
StaxMan
источник
11

Возможно, это всего лишь обходной путь (не очень эффективный), но вы можете сделать что-то вроде этого:

String[] resultingArray = yourJSONarray.join(",").split(",");

Очевидно, вы можете изменить ,разделитель на что угодно (у меня был JSONArrayадрес электронной почты)

Гвидо Сабатини
источник
8
Обратите внимание, что вы должны быть абсолютно уверены, что данные не содержат символ-разделитель, иначе вы получите поврежденные данные.
Artemix
1
и результат должен быть строкой.
Николас Тайлер
Один лайнер, идеально.
zeeshan 04
4

Используйте String[]вместо ArrayList<String>:

Это уменьшит накладные расходы на память, которые имеет ArrayList.

Надеюсь, поможет!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}
nurnachman
источник
3

Используя Java Streams, вы можете просто использовать IntStreamотображение объектов:

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());
Самуэль Филипп
источник
0

Я знаю, что этот вопрос касается 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);
    }
}

Работает также с массивом строк

pchot
источник
0

Вот лучший способ сделать это: если вы получаете данные из API. Затем РАЗБИРАЙТЕ JSON и загружайте его в свой список:

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();

...
Тьяго
источник
0

мы начинаем с преобразования [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;
}

затем создайте общую версию, заменив array.getJSONObject (i ++) на POJO

пример :

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;
}
ceph3us
источник
0

Вы можете использовать String[]вместо ArrayList<String>:

Надеюсь, поможет!

   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;
        }
Иман Мараши
источник
0

   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;
        }

user10878560
источник
0

Мы можем просто преобразовать 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("\",\"");
Маянк Ядав
источник
-2

Я знаю, что вопрос был за Java. Но я хочу поделиться возможным решением, Kotlinпотому что считаю его полезным.

С помощью Kotlin вы можете написать функцию расширения, которая преобразует JSONArrayмассив в собственный (Kotlin) массив:

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

Теперь вы можете asArray()напрямую обращаться к JSONArrayэкземпляру.

Йоханнес Бароп
источник
-3

Как насчет использования java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())
Михал Цадок
источник
15
Я не вижу toArray()метода в JSONArray()документации. json.org/javadoc/org/json/JSONArray.html Этот вопрос, вероятно, не задавали бы, если бы существовал простой toArray().
javajavajavajavajava
1
net.sf.json.JSONArray имеет метод toArray (), поэтому этот ответ работает для этой библиотеки JSON. В вопросе не указана используемая библиотека.
ilinca 03