1

I'm trying to learn MVP. I wrote a code with a help from tutorials and YouTube videos. First of all, I used Json2Class plugin. After that, I created a Json-Server just to have a json file from a rest api to test.

{
"posts": [{
        "userId": 1,
        "id": 1,
        "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
        "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
    },
    {
        "userId": 1,
        "id": 2,
        "title": "qui est esse",
        "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
    },
    {
        "userId": 1,
        "id": 3,
        "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
        "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
    },
    {
        "userId": 1,
        "id": 4,
        "title": "eum et est occaecati",
        "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit"
    }]}

Here is a glimpse from the json file. I converted to Java Class via the plugin. Then in Presenter I have this method

    public void getPosts() {
    getView().onShowDialog("Loading posts.....");
    Observable<PostsResponse> postsResponseObservable = mApiService.getPosts();
    subscribe(postsResponseObservable, this);
}

The ApplicationModule:

    @Singleton
@Provides
Retrofit provideRetrofit(@Named("ok-1") OkHttpClient client, GsonConverterFactory converterFactory,
                         RxJava2CallAdapterFactory adapterFactory){
    return new Retrofit.Builder()
            .baseUrl(mBaseUrl)
            .addConverterFactory(converterFactory)
            .addCallAdapterFactory(adapterFactory)
            .client(client)
            .build();
}

Everything is provided but here is the GsonConverterFactory:

    @Singleton 
@Provides 
GsonConverterFactory provideGsonConverterFactory(){
    return GsonConverterFactory.create();
}

And finally the Mapper:

    public List<Post> mapPosts(PostsResponse response){
    List<Post> postList = new ArrayList<>();
    if (response != null) {
        PostsResponsePosts[] responsePosts = response.getPosts();
        if (responsePosts != null) {
            for (PostsResponsePosts post : responsePosts) {
                Post mPost = new Post();
                mPost.setUserId(post.getUserId());
                mPost.setId(post.getId());
                mPost.setTitle(post.getTitle());
                mPost.setBody(post.getBody());
                postList.add(mPost);
            }
        }
    }
    return postList;
}

But I get IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $. Any solution to this? Thank you very much.

PanosMR
  • 131
  • 1
  • 14

2 Answers2

0

In my opinion problem is in mApiService.getPosts(); method. Please add a code from mApiService. Probably you have something like this:

Call<YourClass> getPosts();

Change it to

Call<List<YourClass>> getPosts();

Sorry for my english...

Volli
  • 51
  • 3
  • I'm not using the Call function, I'm using Observable. Here take a look: `@GET("/posts") Observable getPosts();` I tried to change it to `Observable> getPosts()` but it didn't work. – PanosMR Mar 14 '17 at 14:52
0

Because I'm using Json Server I had to change the Json file from

{
    "posts": [{
            "userId": 1,
            "id": 1,
            "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
            "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
        },
        {
            "userId": 1,
            "id": 2,
            "title": "qui est esse",
            "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
        }
}

to

{
    "posts": {
        "posts": [{
                "userId": 1,
                "id": 1,
                "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
            },
            {
                "userId": 1,
                "id": 2,
                "title": "qui est esse",
                "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
            }
}
PanosMR
  • 131
  • 1
  • 14