Странное поведение при вызове org.json.JSONObject.getJSONArray - PullRequest
0 голосов
/ 21 апреля 2011

Эй, Я заметил это действительно странное поведение при вызове getJSONArray. Это мой код:

 JSONObject jsonObject = new JSONObject(data);
 if (!jsonObject.getJSONObject("transfer").has("skill"))
     return Collections.emptyList();
 JSONArray events = jsonObject.getJSONObject("transfer").getJSONArray("skill");

Теперь, когда у передачи есть более 1 элемента навыка, все отлично работает, но когда есть только 1 элемент навыка, я получаю исключение:

Причина: org.json.JSONException: Значение {"id": "2", "name": "DOGS"} в навык типа org.json.JSONObject не может быть преобразован в JSONArray в org.json.JSON.typeMismatch (JSON.java:96) в org.json.JSONObject.getJSONArray (JSONObject.java:548) ....

Это имеет смысл? Неужели мне действительно нужно перехватить исключение и обработать этот массив?

Спасибо, Уди

Ответы [ 2 ]

4 голосов
/ 21 апреля 2011

В JSON, который вы читаете, когда есть один элемент, он, вероятно, имеет что-то вроде:

skill: {"id":"2","name":"DOGS"}

вместо:

skill: [{"id":"2","name":"DOGS"}]

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

Вам нужно либо проверить, что значение «skill» является массивом, прежде чем использовать getJSONArray, либо предположить, что это массив, и перехватить исключение для обработки случая отдельного объекта. С другой стороны, если вы можете изменить приложение, генерирующее JSON, вы можете исправить его, поместив объект «skill» в массив, даже если он есть.

4 голосов
/ 21 апреля 2011

Каждый раз, когда вы получаете объект JSON, окружите ваш код блоком try / catch.Таким образом, ваша программа продолжит работу, когда вы получите неожиданные объекты JSON.

Что касается вашей ошибки, похоже, что ваш "навык" JSONArray не сохраняется в виде массива, когда имеется только один элемент.Если вы используете веб-сервис для создания объекта JSON, проблема может заключаться в веб-сервисе.

...