JsonReader выдает исключение IllegalStateException

Я обнаружил, что использование http://ip-api.com/json — это простой способ получить необходимые данные о местоположении пользователя. Результат, например с сайта:

{"as":"AS37061 ONECOM","city":"Nairobi","country":"Kenya","countryCode":"KE","isp":"One Communications Ltd","lat":-1.2833,"lon":36.8167,"org":"ONECOM","query":"41.203.219.198","region":"110","regionName":"Nairobi Province","status":"success","timezone":"Africa/Nairobi","zip":""}

Я анализировал приведенный выше результат Json со следующим кодом:

String countryCode = null;
    String name = null;

    if (reader != null) {
        try {
            reader.setLenient(true);

            reader.beginObject();

            while (reader.hasNext()) {
                switch (reader.nextName()) {
                    case "countryCode":
                        countryCode = reader.nextString().toLowerCase();
                        break;
                    case "country":
                        name = reader.nextString();
                        break;
                    default:
                        reader.skipValue();
                        break;
                }
            }

            reader.endObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Теперь я получаю эту ошибку:

Fatal Exception: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was END_DOCUMENT at line 1 column 2016
   at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
   at com.radioafrica.music.fragment.TopTracks.getCountryCode(TopTracks.java:397)
   at com.radioafrica.music.fragment.TopTracks.access$1100(TopTracks.java:57)
   at com.radioafrica.music.fragment.TopTracks$9.run(TopTracks.java:377)
   at java.lang.Thread.run(Thread.java:818)

Насколько я могу судить, код в порядке, но он не всегда работает. В чем проблема?


person Alex Kombo    schedule 23.11.2015    source источник


Ответы (1)


Я думаю, что есть две проблемы: вы что-то забыли в своем коде и то, как вы парсите JSON:

  1. Похоже, ваш код не проверяет, содержит ли reader пустую строку. (Это может произойти, когда IP-API возвращает неверный ответ или вообще ничего).
  2. Бонус: вам не следует решать эту низкоуровневую проблему самостоятельно. На самом деле, множество очень легких и чрезвычайно надежных библиотек сделают за вас синтаксический анализ JSON. Он справится с такой проблемой и даст вам четкое исключение. Вы можете попробовать Gson или что-то еще, что лучше соответствует вашим потребностям.
person mithrop    schedule 23.11.2015
comment
Позвольте мне переключиться на использование Gson и проверить, работает ли он лучше. - person Alex Kombo; 23.11.2015