Перебор нескольких объектов в файле JSON

#java #json

#java #json

Вопрос:

Я анализирую файл JSON, который я извлекаю, обращаясь к API. Прямо сейчас я могу создать ArrayList объектов моего класса Offer, но я читаю только первый объект JSON и получаю интересующие меня строки. Как мне создать столько собственных объектов Offer, сколько их есть в файле JSON?

Другими словами, мне нужно выполнить итерацию по файлу JSON и получить все предложения.

JSON выглядит следующим образом:

{"offer":"expiration":"2011-04-08T02:30:00Z","valid_from":"2011-04-07T12:00:31Z","business":{"address":{"state":"NY","zip":"10013","cross_streets":"Chatham Sq amp;amp; Worth St","address_1":"12 Mott St","address_2":null,"city":"New York"},"phone":"2126192989","published":"2011-04-07T12:00:33Z","rescinded_at":null,"valid_to":"2011-04-08T02:00:00Z"}}, {"offer":"expiration":"2011-04-08T02:30:00Z","valid_from":"2011-04-07T12:00:31Z","business":{"address":{"state":"NY","zip":"10013","cross_streets":"Chatham Sq amp;amp; Worth St","address_1":"12 Mott St","address_2":null,"city":"New York"},"phone":"2126192989","published":"2011-04-07T12:00:33Z","rescinded_at":null,"valid_to":"2011-04-08T02:00:00Z"}},
{"offer":"expiration":"2011-04-08T02:30:00Z","valid_from":"2011-04-07T12:00:31Z","business":{"address":{"state":"NY","zip":"10013","cross_streets":"Chatham Sq amp;amp; Worth St","address_1":"12 Mott St","address_2":null,"city":"New York"},"phone":"2126192989","published":"2011-04-07T12:00:33Z","rescinded_at":null,"valid_to":"2011-04-08T02:00:00Z"}}

Как вы можете видеть, один объект предложения следует за другим…

Вот мой код на данный момент:

         ArrayList<Offer> offerList = new ArrayList<Offer>();

        for(String url: urls) {
            OAuthConsumer consumer = new DefaultOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
            consumer.setTokenWithSecret("", "");

            try {

                URL url1 = new URL(url);
                HttpURLConnection request = (HttpURLConnection) url1.openConnection();

                // sign the request
                consumer.sign(request);

                // send the request
                request.connect();


                String JSONString = convertStreamToString(request.getInputStream());

                JSONObject jObject = new JSONObject(JSONString);

                JSONObject offerObject = jObject.getJSONObject("offer");

                String titleValue = offerObject.getString("title");
                //System.out.println(titleValue);

                String descriptionValue = offerObject.getString("description");
                //System.out.println(attributeValue);
                JSONObject businessObject = offerObject.getJSONObject("business");
                String nameValue = businessObject.getString("name");

                Offer myOffer = new Offer(titleValue, descriptionValue, nameValue);

                offerList.add(myOffer);
                Log.v("ArrayList:", offerList.toString());

            } catch (Exception e) {
                e.printStackTrace();

            } 
        }
        return offerList; 
  

Ответ №1:

Представленный вами JSON не является допустимым JSON.

Если вы поместите ‘[‘ в начале и ‘]’ в конце, это станет допустимым JSONArray.

JSONArray JavaDoc

Вы должны быть в состоянии сделать что-то вроде этого:

 JSONArray array = new JSONArray(inputJSON);
for(int index = 0; index < array.length();   index) {
  JSONObject offerObject = array.getJSONObject(index);
  //... your offer calculation...add offer to list...
}
  

Если у вас есть JSONArray из JSONObjects вашего предложения JSON (что будет, если вы добавите скобки, как я предложил), то вы можете выполнять итерации по длине JSONArray, получать свой JSONObject на каждом проходе и создавать предложение точно так же, как вы делали в приведенном вами примере.

Комментарии:

1. Черт, ты прав. Я использовал substring, чтобы отключить «[» и «]» в начале и конце файла, потому что я думал, что мой метод convertStreamToString добавляет это, но это не так. Итак, у меня есть JSONArray. Можете ли вы показать мне, как выполнить перебор по массиву? У меня возникли проблемы…