Данные JSON читаются, но не могут быть преобразованы в JSONArray

Я разрабатываю приложение, которое читает данные JSON. Данные Json анализируются, но не отображаются в списке. Logcat говорит о несоответствии типов. Я не очень знаком в Джсоне.
http://api.openweathermap.org/data/2.5/forecast/daily?lat=6.421465&lon=81.332396&cnt=10&mode=json

Это мой логкат и код. Пожалуйста, поделите меня с этим.

org.json.JSONException: индекс 1 находится вне диапазона [0..1) org.json.JSONArray.get(JSONArray.java:263) org.json.JSONArray.getString(JSONArray.java:421) com.is.parsej.ParseJ$GetContacts.doInBackground(ParseJ.java:141) com.is.parsej.ParseJ$GetContacts.doInBackground(ParseJ.java:1) android.os.AsyncTask$2.call(AsyncTask.java:287) java.util.concurrent.FutureTask.run(FutureTask.java:234) android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.j)

   public class ParseJ extends ListActivity {

         private ProgressDialog pDialog;

            // URL to get contacts JSON
            private static String url = "http://api.openweathermap.org/data/2.5/forecast/daily?lat=6.421465&lon=81.332396&cnt=10&mode=json";

            // JSON Node names
            private static final String TAG_COd = "list"; //edited
            private static final String TAG_ID = "dt";    //edited

            private static final String TAG_WEATHER = "weather";
            private static final String TAG_MAIN = "main";
            private static final String TAG_DESC = "description";

            private static final String TAG_TEMP = "temp";
            private static final String TAG_DAY = "day";
            private static final String TAG_MIN = "min";
            private static final String TAG_MAX = "max";
            private static final String TAG_NIGHT = "night";
            private static final String TAG_MORN= "morn";

            private static final String TAG_HUMIDITY = "humidity";

            // contacts JSONArray
            JSONArray contacts = null;

            // Hashmap for ListView
            ArrayList<HashMap<String, String>> contactList;

            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_parse_j);

                contactList = new ArrayList<HashMap<String, String>>();

                ListView lv = getListView();

                // Listview on item click listener
                lv.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
                        // getting values from selected ListItem
                        String weather = ((TextView) view.findViewById(R.id.main))
                                .getText().toString();
                        String Temp = ((TextView) view.findViewById(R.id.Descrption))
                                .getText().toString();
                        String Humidity = ((TextView) view.findViewById(R.id.temp))
                                .getText().toString();

                        // Starting single contact activity
                        Intent in = new Intent(getApplicationContext(),
                                SingleContactActivity.class);
                        in.putExtra(TAG_WEATHER, weather);
                        in.putExtra(TAG_TEMP, Temp);
                        in.putExtra(TAG_HUMIDITY, Humidity);
                        startActivity(in);

                    }
                });

                // Calling async task to get json
                new GetContacts().execute();
            }

            /**
             * Async task class to get json by making HTTP call
             * */
            private class GetContacts extends AsyncTask<Void, Void, Void> {

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    // Showing progress dialog
                    pDialog = new ProgressDialog(ParseJ.this);
                    pDialog.setMessage("Please wait...");
                    pDialog.setCancelable(false);
                    pDialog.show();

                }

                @Override
                protected Void doInBackground(Void... arg0) {
                    // Creating service handler class instance
                    ServiceHandler sh = new ServiceHandler();

                    // Making a request to url and getting response
                    String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

                    Log.d("Response: ", "> " + jsonStr);

                    if (jsonStr != null) {
                        try {
                            JSONObject jsonObj = new JSONObject(jsonStr);

                            // Getting JSON Array node
                            contacts = jsonObj.getJSONArray(TAG_COd);

                            // looping through All Contacts
                            for (int i = 0; i < contacts.length(); i++) {
                                JSONObject c = contacts.getJSONObject(i);

                                String id = c.getString(TAG_ID);
                                String humidity = c.getString(TAG_HUMIDITY);

                                // Phone node is JSON Object
                                JSONObject temp = c.getJSONObject(TAG_TEMP);
                                String day = temp.getString(TAG_DAY);
                                String maxTemp = temp.getString(TAG_MAX);
                                String minTemp = temp.getString(TAG_MIN);
                                String morningTemp = temp.getString(TAG_MORN);
                                //edited
                                JSONArray weather = c.getJSONArray(TAG_WEATHER);
                                String main = weather.getString(1);
                                String desc = weather.getString(2); 

                                // tmp hashmap for single contact
                                HashMap<String, String> contact = new HashMap<String, String>();

                                // adding each child node to HashMap key => value
                                contact.put(TAG_ID, id);
                                contact.put(TAG_DAY, day);
                                contact.put(TAG_DESC, desc);
                                contact.put(TAG_HUMIDITY, humidity);

                                // adding contact to contact list
                                contactList.add(contact);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    } else {
                        Log.e("ServiceHandler", "Couldn't get any data from the url");
                    }

                    return null;
                }

                @Override
                protected void onPostExecute(Void result) {
                    super.onPostExecute(result);
                    // Dismiss the progress dialog
                    if (pDialog.isShowing())
                        pDialog.dismiss();
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            ParseJ.this, contactList,
                            R.layout.list_item, new String[] { TAG_DAY, TAG_DESC,
                                    TAG_HUMIDITY }, new int[] { R.id.temp,
                                    R.id.main, R.id.Descrption });

                    setListAdapter(adapter);
                }

            }

        }

4 ответа

Решение

Основываясь на вашем JSON это просто список элементов. Массивы имеют [ в начале и ] в конце. Посмотрите внимательно на свой JSON, вы можете найти там некоторые элементы массива, которые имеют [],

погода имеет только 1 элемент

"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}]

Индекс вне границ, потому что вы используете

   JSONArray weather = c.getJSONArray(TAG_WEATHER);
   String main = weather.getString(1);
   String desc = weather.getString(2);

где в вашем массиве json нет 1 и 2, так как в погоде, кажется, только один элемент помещает его в другой объект json

JSONObject weather = c.getJSONArray(TAG_WEATHER).getJSONObject(0);
String main = weather.getString("main");
String desc = weather.getString("description");

JSON здесь

{"cod": "200", "message": 0.2809, "city": {"id": 1244926, "name": "Hambantota", "ord":{"lon":81.1185,"lat":6.1241},"страна":"LK","население": 0}, "CNT": 10, "список":[{"дт": 1409896800, "темп": { "день": 301,95, "мин": 300,47, "макс": 302,12, "ночь": 301,31, "накануне": 301,87, "дорогою": 300,47}, "давление": 1020,63, "влажность": 88, "погода":[{"ID":803,"main":"Clouds","description":"Clouds Cloud","icon":"04d"}],"speed": 6.47,"deg":243,"clouds": 56}, {"dt ": 1409983200," температура ": {" день ": 301,11," мин ": 299,62," макс ": 301,29," ночь ": 299,62," накануне ": 300,76," дорогою ": 300,13}," давление ": 1021.53, "влажность": 92, "погода":[{"id":802,"main":"Clouds","description":"рассеянные облака","icon":"03d"}],"speed": 6,66, "град": 249, "облака": 48}, { "DT": 1410069600, "температура": { "день": 300,9, "мин": 299,36, "макс": 300,9, "ночь": 299,58, "накануне": 300,2, "дорогою": 299,36}, "давление": 1022,25, "влажность": 90, "погода":[{"ID": 803, "основные": "Облака", "описание": "облачность", "значок": "04d"}], "скорость": 7.21, "град": 242, "облака": 80}, {"dt": 1410156000, "temp": {"день": 299,47, "мин": 298,71, "макс": 300,44, "НИГ ХТ ": 299,5," Накануне ": 299.96," дорогою ": 298,71}," Давление ": 1023,27," влажность ": 98," погода ": [{" ID ": 802," основные ":" Облака", "description": "рассеянные облака","icon":"03d"}],"speed": 5.83,"deg":252,"clouds": 44}, {"dt": 1410242400, "temp": { "день": 301,38, "мин": 297,39, "макс": 301,38, "ночь": 298,36, "накануне": 300,82, "дорогою": 297,39}, "давление": 1012,02, "влажность": 0," погода ":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"speed": 3.87," deg ": 250, "облака": 76, "дождь": 0.38}, { "дт": 1410328800, "температура": { "день": 301,77, "мин": 297,49, "макс": 301,77, "ночь": 299,44," накануне ": 301,13," дорогою ": 297,49}," давление ": 1011,84," влажность ": 0," погода ": [{" ID ": 500," главный ":" дождь " "описание":" свет дождь", "значок": "10d"}], "скорость": 4,88, "град": 259, "облака": 27, "дождь": 0.82}, { "дт": 1410415200, "темп": { "день": 302,15, "мин": 299,15, "макс": 302,15, "ночь": 299,43, "накануне": 300,52, "дорогою": 299,15}, "давление": 1011,1, "влажность": 0," погода ":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"speed": 6.3," deg ": 257, "облака": 64, "дождь": 1.82}, { "дт": 1410501600," Темп ": {" день ": 301,52," мин ": 299,16," Макс ": 301,52," ночь ": 299,36," Накануне ": 300,59," дорогою ": 299,16}," Давление ": 1011,05," влажность": 0, "погода": [{"id": 500, "main": "Rain", "description": "light rain", "icon": "10d"}], "speed": 8.05, "deg ": 257," облака ": 50," дождь ": 2.38}, {" дт ": 1410588000," температура ": {" день ": 301,26," мин ": 298,74," макс ": 301,26," ночь": 299,53, "накануне": 300,43, "дорогою": 298,74}, "давление": 1010,43, "влажность": 0, "погода":[{"ID": 500, "главный": "дождь", "описание ":" легкий дождь "," значок ":" 10d "}]," скорость ": 7,69," градус ": 258," облака ": 33," дождь ": 1,34}, {" dt ": 1410674400," темп ": {" день ": 300.01," мин ": 298,37," макс ": 300.01," ночь ": 298,48," накануне ": 298,37," дорогою ": 298,87}," давление ": 1010,17," влажность": 0, "погода": [{"id": 501, "main": "дождь", "description": "умеренный дождь", "icon": "10d"}], "скорость": 8.36, "deg ": 253," облако ": 55," дождь ": 8.91}

и тогда вы получите объект с тегом "треска"

contacts = jsonObj.getJSONArray(TAG_COd)

"Треск": "200"

вы получите "200"

Как можно преобразовать "200" в JSONArray? структура массива такая же [{"dt":1409896800},{"dt":1409896800},{"dt":1409896800},{"dt":1409896800}]

начинается с "[" и заканчивается "]"

                 JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    contacts = jsonObj.getJSONArray("list");

                    // looping through All Contacts
                    for (int i = 0; i < contacts.length(); i++) {
}

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

Исключение объясняет сам

org.json.JSONException: Value 200 at cod of type java.lang.String cannot be converted to JSONArray

Вы конвертируете String в JSONArray Вот,

contacts = jsonObj.getJSONArray(TAG_COd);

cod является строкой, пока вы конвертируете ее в JSONArray

String cod = jsonObj.getJSONString(TAG_COd);
Другие вопросы по тегам