Обработка залпа при отсутствии ключа - PullRequest
0 голосов
/ 04 октября 2018

Я реализовал представление Volley и Recycler для анализа и отображения списка нескольких элементов из простого файла JSON.Есть моменты, когда ключ не существует в объекте, но может появиться в другом объекте.Этот ключ уже определен с использованием object.getInt ("someKey").

Как только Volley начинает анализировать объект с отсутствующим ключом, он выходит из цикла for (объекты хранятся в массиве) и перехватываетJSONException e, что именно то, что приложение должно делать в случае отсутствия ключа.

Однако я хотел бы предотвратить это поведение и использовать значение заполнителя для этого отсутствующего ключа этого конкретного объекта,чтобы список массивов был успешно собран, а представление переработчика заполнено, и приложение начинает работать нормально.

Какую логику я могу использовать для достижения этой цели?

Спасибо!

private void parseJSON() {

    String url = "https://example.com/index.json";
    JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {

                    try {
                        for (int i = 0; i < response.length(); i++) {
                            JSONObject object = response.getJSONObject(i);

                            String title = object.getString("subject");
                            String description = object.getString("message");
                            String imageUrl = object.getString("thumb");
                            Integer threadId = object.getInt("threadId");

                            mList.add(new Item( title, description, threadId));

                        }


                        mItemAdapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();

                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

В приведенном выше коде threadId является ключом, который может появляться или не отображаться во многих объектах JSON.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

object.getInt("someKey") - чтобы получить значение от "somekey". Если somekey не появляется, это показывает JSONException.Вместо этого object.optInt("someKey").Он получит значение от «somekey», если он появится, в противном случае он будет пропущен.Это простое решение.Спасибо

0 голосов
/ 04 октября 2018

Если я хорошо понял ваш вопрос, вот что вам нужно сделать, если вы не уверены, существует ли этот ключ, используйте следующее

jsonObject.optBoolean("yourKey");
        jsonObject.optInt("yourKey");
        jsonObject.optString("yourKey");
        jsonObject.optLong("yourKey");
        jsonObject.optDouble("yourKey");
        jsonObject.optJSONArray("yourKey");

, это обеспечит, что jsonObject проигнорирует этот ключ, если нене существует.

0 голосов
/ 04 октября 2018

Вы можете сначала проверить, существует ли ваш ключ на объекте

 try {
        for (int i = 0; i < response.length(); i++) {
            JSONObject object = response.getJSONObject(i);

            String title = object.getString("subject");
            String description = object.getString("message");
            String imageUrl = object.getString("thumb");
            Integer threadId;
            if(object.toString().contain("threadId"){
                threadId = object.getInt("threadId");
            }else{
                threadId = 0;
            }
            mList.add(new Item( title, description, threadId));
        }
        mItemAdapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }
...