JSON - Итерация через JSONArray

У меня есть файл JSON с некоторыми массивами. Я хочу перебирать массивы файлов и получать их элементы и их значения.

Вот как выглядит мой файл:

{
"JObjects": {
    "JArray1": [
        {
            "A": "a",
            "B": "b",
            "C": "c"
        },
        {
            "A": "a1",
            "B": "b2",
            "C": "c3",
            "D": "d4"
            "E": "e5"
        },
        {
            "A": "aa",
            "B": "bb",
            "C": "cc",
            "D": "dd"
        }

    ]
}

}       

Вот как далеко я пришел:

JSONObject object = new JSONObject("json-file.json");
JSONObject getObject = object.getJSONObject("JObjects");
JSONArray getArray = getObject.getJSONArray("JArray1");

for(int i = 0; i < getArray.size(); i++)
{
      JSONObject objects = getArray.getJSONArray(i);
      //Iterate through the elements of the array i.
      //Get thier value.
      //Get the value for the first element and the value for the last element.
}

Можно ли сделать что-то вроде этого?

Причина, по которой я хочу сделать это, состоит в том, что массивы в файле имеют различное количество элементов.

Ответ 1

Изменить

JSONObject objects = getArray.getJSONArray(i);

к

JSONObject objects = getArray.getJSONObject(i);

или

JSONObject objects = getArray.optJSONObject(i);

в зависимости от используемой библиотеки JSON-to/from-Java. (Похоже, что getJSONObject будет работать для вас.)

Затем, чтобы получить доступ к строковым элементам в "объектах" JSONObject, выведите их по имени элемента.

String a = objects.get("A");

Если вам нужны имена элементов в JSONObject, вы можете использовать статический метод утилиты JSONObject.getNames(JSONObject) для этого.

String[] elementNames = JSONObject.getNames(objects);

"Получить значение для первого элемента и значение для последнего элемента."

Если "element" ссылается на компонент в массиве, обратите внимание, что первый компонент находится в индексе 0, а последний компонент имеет индекс getArray.length() - 1.


Я хочу повторить итерацию объектов в массиве и получить его компонент и его значение. В моем примере первый объект имеет 3 компонента, у scond 5, а у третьего - 4 компонента. Я хочу итерации, хотя и каждый из них, и получить их имя и значение.

Следующий код выполняет именно это.

import org.json.JSONArray;
import org.json.JSONObject;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    String jsonInput = "{\"JObjects\":{\"JArray1\":[{\"A\":\"a\",\"B\":\"b\",\"C\":\"c\"},{\"A\":\"a1\",\"B\":\"b2\",\"C\":\"c3\",\"D\":\"d4\",\"E\":\"e5\"},{\"A\":\"aa\",\"B\":\"bb\",\"C\":\"cc\",\"D\":\"dd\"}]}}";

    // "I want to iterate though the objects in the array..."
    JSONObject outerObject = new JSONObject(jsonInput);
    JSONObject innerObject = outerObject.getJSONObject("JObjects");
    JSONArray jsonArray = innerObject.getJSONArray("JArray1");
    for (int i = 0, size = jsonArray.length(); i < size; i++)
    {
      JSONObject objectInArray = jsonArray.getJSONObject(i);

      // "...and get thier component and thier value."
      String[] elementNames = JSONObject.getNames(objectInArray);
      System.out.printf("%d ELEMENTS IN CURRENT OBJECT:\n", elementNames.length);
      for (String elementName : elementNames)
      {
        String value = objectInArray.getString(elementName);
        System.out.printf("name=%s, value=%s\n", elementName, value);
      }
      System.out.println();
    }
  }
}
/*
OUTPUT:
3 ELEMENTS IN CURRENT OBJECT:
name=A, value=a
name=B, value=b
name=C, value=c

5 ELEMENTS IN CURRENT OBJECT:
name=D, value=d4
name=E, value=e5
name=A, value=a1
name=B, value=b2
name=C, value=c3

4 ELEMENTS IN CURRENT OBJECT:
name=D, value=dd
name=A, value=aa
name=B, value=bb
name=C, value=cc
*/

Ответ 2

for (int i = 0; i < getArray.length(); i++) {
            JSONObject objects = getArray.getJSONObject(i);
            Iterator key = objects.keys();
            while (key.hasNext()) {
                String k = key.next().toString();
                System.out.println("Key : " + k + ", value : "
                        + objects.getString(k));
            }
            // System.out.println(objects.toString());
            System.out.println("-----------");

        }

Надеюсь, это поможет кому-то

Ответ 3

for(int i = 0; i < getArray.size(); i++){
      Object object = getArray.get(i);
      // now do something with the Object
}

Вам нужно проверить тип:

Значения могут быть любого из следующих типов: Boolean, JSONArray, JSONObject, Number, String или JSONObject.NULL. [Источник]

В вашем случае элементы будут иметь тип JSONObject, поэтому вам нужно отправить в JSONObject и вызвать JSONObject.names() для извлечения отдельного ключи.

Ответ 4

JsonArray jsonArray;
Iterator<JsonElement> it = jsonArray.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

Ответ 5

Вы можете попробовать рекурсивный метод (* сильно заимствованный из разных сайтов) для прохождения через все объекты JSON и массивы JSON до тех пор, пока вы не найдете элементы JSON. Этот пример фактически ищет конкретный ключ и возвращает все значения для всех экземпляров этого ключа. "searchKey" - это ключ, который вы ищете.

ArrayList<String> myList = new ArrayList<String>();
myList = findMyKeyValue(yourJsonPayload,null,"A"); //if you only wanted to search for A values

    private ArrayList<String> findMyKeyValue(JsonElement element, String key, String searchKey) {

    //OBJECT
    if(element.isJsonObject()) {
        JsonObject jsonObject = element.getAsJsonObject();

        //loop through all elements in object

        for (Map.Entry<String,JsonElement> entry : jsonObject.entrySet()) {
            JsonElement array = entry.getValue();
            findMyKeyValue(array, entry.getKey(), searchKey);

        }

    //ARRAY
    } else if(element.isJsonArray()) {
        //when an array is found keep 'key' as that is the array name i.e. pass it down

        JsonArray jsonArray = element.getAsJsonArray();

        //loop through all elements in array
        for (JsonElement childElement : jsonArray) {
            findMyKeyValue(childElement, key, searchKey);
        }

    //NEITHER
    } else {

        //System.out.println("SKey: " + searchKey + " Key: " + key );

            if (key.equals(searchKey)){
                listOfValues.add(element.getAsString());
            }
    }
    return listOfValues;
}