2016-09-19 8 views
1

Я пытаюсь десериализовать json из worldbank.com в pojo без каких-либо успехов. Json выглядит так: [{"страница": 1, "pages": 7, "per_page": "50", "total": 304}, [{"id": "ABW", "iso2Code": " AW " "имя": "Аруба", "область": { "ID": "LCN", "значение":" Латинская Америка & Caribbean «},deserialize json with gson

и могут быть найдены с помощью: http://api.worldbank.org/countries/?format=json

и им нарваться проблемы с gson говорил мне: WorldBankDemo: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Ожидаемое BEGIN_OBJECT но BEGIN_ARRAY в строке 1 колонки 52 пути $ [1]

Любые подсказки, как как я могу это решить? Предпочтительно, не изменяя от gson так как это Lib используется сетевой Lib Я использую (дооснащения)

WorldBankDataService service = ServiceFactory.createRetrofitService(WorldBankDataService.class, WorldBankDataService.SERVICE_ENDPOINT); 
     service.getCountries() 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<WorldBank[]>() { 
        @Override 
        public final void onCompleted() { 
         // do nothing 
        } 

        @Override 
        public final void onError(Throwable e) { 
         Log.e("WorldBankDemo", e.getMessage()); 
        } 

        @Override 
        public final void onNext(WorldBank[] response) { 
         Log.d("TAG", "resp: "+response); 
         //mCardAdapter.addData(response); 
        } 
       }); 


public class ServiceFactory { 
/** 
* Creates a retrofit service from an arbitrary class (clazz) 
* @param clazz Java interface of the retrofit service 
* @param endPoint REST endpoint url 
* @return retrofit service with defined endpoint 
*/ 
public static <T> T createRetrofitService(final Class<T> clazz, final 
String endPoint) { 
     final RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(endPoint) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .build(); 
     T service = restAdapter.create(clazz); 

     return service; 
    } 
} 

public class WorldBank { 
    int page; 
    int pages; 
    String per_page; 
    int total; 
    //Country[] countrys; 
} 
+1

поставить код здесь –

+1

Показать ваш код .... – ElefantPhace

+0

введите ваш ** код WorldBankDemo ** здесь? –

ответ

1

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

0

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

YourPojo[] objects = gson.fromJson(jsonString, YourPojo[].class) 

работает как шарм

+0

Здесь не говорится о странице и страницах. просто массив json с id и iso2code. – drulabs

+0

как это сделать с модификацией? Синтаксический анализ скрыт в рамках модифицированной структуры :( – erbsman

+0

Просто посмотрел ваш отредактированный вопрос с кодом. При необходимости получите необработанную строку и проанализируйте самостоятельно. Я не уверен, что это возможно в «Дооснащении». Другое решение - создать класс сопоставляя ответ JSON и рассказываем об обновлении, чтобы дать вам объект этого класса. Этот класс будет иметь WorldBank как частную переменную и массив этого класса id и iso2code pojo. – drulabs

0

попробовать этот способ

Gson gson = new Gson(); 
String jsonOutput = "Your JSON String"; 
Type listType = new TypeToken<List<ApiResponse>>(){}.getType(); 
List<ApiResponse> posts = (List<ApiResponse>) gson.fromJson(jsonOutput, listType); 

и ApiResponse, как

public class ApiResponse{ 
WorldBank object1; 
ArrayList<Country> objects2; 
} 

Я не попробовать это на моем конце , но это будет похоже на это.

0

Вы можете использовать gson настроить используя эту зависимость

compile 'org.immutables:gson:2.3.1' 

Но несколько иначе при вызове клиента остальное

Например .Если мы должны получить список стран объявить интерфейс

public interface GetAllAPI { 
@GET("/all") 
    List<Country> getCountries(); 
} 

Теперь клиент остальные будут

public List<Country> GetAllCountries() { 

    Gson gson = new GsonBuilder().create(); 

    RestAdapter restAdapter = new RestAdapter.Builder() 
    .setEndpoint(service_url) 
    .setConverter(new GsonConverter(gson)) 
    .build(); 

    GetAllAPI service = restAdapter.create(GetAllAPI.class); 

    List<Country> countrylist = service.getCountries(); 

    return countrylist; 
} 

Получение результатов из API будет

List<Country> countrylist = service.getCountries(); 

Вы должны настроить эту реализацию конкретных требований.Это идея, как реализовать Gson с Retrofit

Перейти через this Дополнительные разъяснения

0

Решил отказаться и использовать другой API, мир банк апи просто отстой :(

Смежные вопросы