WedX - журнал о программировании и компьютерных науках

Доступ к членам элементов в JSONArray с помощью Java

Я только начинаю использовать json с java. Я не уверен, как получить доступ к строковым значениям в JSONArray. Например, мой json выглядит так:

{
  "locations": {
    "record": [
      {
        "id": 8817,
        "loc": "NEW YORK CITY"
      },
      {
        "id": 2873,
        "loc": "UNITED STATES"
      },
      {
        "id": 1501
        "loc": "NEW YORK STATE"
      }
    ]
  }
}

мой код:

JSONObject req = new JSONObject(join(loadStrings(data.json),""));
JSONObject locs = req.getJSONObject("locations");
JSONArray recs = locs.getJSONArray("record");

На данный момент у меня есть доступ к «записи» JSONArray, но я не уверен, как получить значения «id» и «loc» в цикле for. Извините, если это описание не слишком понятно, я немного новичок в программировании.

14.10.2009

  • Еще один момент (возможно, вы его нашли) - вы пропустили запятую после третьего значения id. Хорошо всегда использовать парсер, например json.parser.online.fr 15.03.2016

Ответы:


1

Пробовали ли вы использовать JSONArray.getJSONObject(int) и JSONArray.length() для создания цикла for:

for (int i = 0; i < recs.length(); ++i) {
    JSONObject rec = recs.getJSONObject(i);
    int id = rec.getInt("id");
    String loc = rec.getString("loc");
    // ...
}
14.10.2009
  • Я не понимаю. Если мы можем получить id с помощью простого getInt подобно тому, как мы получаем значение хэш-карты, указав ключ, то зачем нам повторять цикл for? Разве итерация с циклом не приводит к тому, что id назначается int id несколько раз? 28.06.2016
  • Для более сложного JSON нашел это хорошее решение для examples.javacodegeeks. com/core-java/json/ 29.06.2016
  • Как это будет работать, если я знаю идентификатор, но мне нужна соответствующая локация? 06.03.2019

  • 2

    org.json.JSONArray нельзя повторять.
    Вот как это сделать. Я обрабатываю элементы в net.sf.json.JSONArray:

        JSONArray lineItems = jsonObject.getJSONArray("lineItems");
        for (Object o : lineItems) {
            JSONObject jsonLineItem = (JSONObject) o;
            String key = jsonLineItem.getString("key");
            String value = jsonLineItem.getString("value");
            ...
        }
    

    Работает отлично... :)

    10.11.2009
  • Это не работает для меня, так как JSONArray не повторяется. 06.05.2012
  • org.json.JSONArray не повторяется, но net.sf.json.JSONArray является итерируемым 11.07.2013
  • ваша ссылка не работает 29.09.2017

  • 3

    Java 8 вышла на рынок спустя почти 2 десятилетия, и ниже описан способ повторения org.json.JSONArray с помощью java8 Stream API.

    import org.json.JSONArray;
    import org.json.JSONObject;
    
    @Test
    public void access_org_JsonArray() {
        //Given: array
        JSONArray jsonArray = new JSONArray(Arrays.asList(new JSONObject(
                        new HashMap() {{
                            put("a", 100);
                            put("b", 200);
                        }}
                ),
                new JSONObject(
                        new HashMap() {{
                            put("a", 300);
                            put("b", 400);
                        }}
                )));
    
        //Then: convert to List<JSONObject>
        List<JSONObject> jsonItems = IntStream.range(0, jsonArray.length())
                .mapToObj(index -> (JSONObject) jsonArray.get(index))
                .collect(Collectors.toList());
    
        // you can access the array elements now
        jsonItems.forEach(arrayElement -> System.out.println(arrayElement.get("a")));
        // prints 100, 300
    }
    

    Если итерация выполняется только один раз (не нужно .collect)

        IntStream.range(0, jsonArray.length())
                .mapToObj(index -> (JSONObject) jsonArray.get(index))
                .forEach(item -> {
                   System.out.println(item);
                });
    
    05.06.2017
  • .mapToObj показывает необработанное исключение: JSONException 09.11.2017
  • в синтаксисе .mapToObj(index -> (JSONObject) array.get(index)) есть jsonArray.get(index), который потенциально может генерировать JSONException, но JSONException extends RuntimeException, так что это должно быть хорошо, по крайней мере, во время компиляции 11.11.2017

  • 4

    Глядя на ваш код, я чувствую, что вы используете JSONLIB. Если это так, посмотрите на следующий фрагмент, чтобы преобразовать массив json в массив java.

     JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( input );  
     JsonConfig jsonConfig = new JsonConfig();  
     jsonConfig.setArrayMode( JsonConfig.MODE_OBJECT_ARRAY );  
     jsonConfig.setRootClass( Integer.TYPE );  
     int[] output = (int[]) JSONSerializer.toJava( jsonArray, jsonConfig );  
    
    14.10.2009

    5

    На случай, если это поможет кому-то еще, я смог преобразовать в массив, сделав что-то вроде этого:

    JSONObject jsonObject = (JSONObject)new JSONParser().parse(jsonString);
    ((JSONArray) jsonObject).toArray()
    

    ... или вы должны быть в состоянии получить длину

    ((JSONArray) myJsonArray).toArray().length
    
    02.06.2015
  • org.json.JSONObject имеет метод toJSONArray(JSONArray names), а org.json.JSONArray имеет метод toJSONObject(JSONArray names), но не имеет метода toArray(). 10.03.2017

  • 6

    HashMap regs = (HashMap) parser.parse(stringjson);

    (String)((HashMap)regs.get("firstlevelkey")).get("secondlevelkey");

    01.11.2017
  • Еще немного пояснений, почему ваш ответ лучше, чем текущий принятый, поможет понять ваше решение. 02.11.2017
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]