Ожидался BEGIN_OBJECT, но был BEGIN_ARRAY: Retrofit2 Android

Я новичок в разборе JSON и пытаюсь разобрать следующий JSON:

[
 {
"id" : 1,
"title" : {
    "rendered": "a link"
 },
"categories": [ 4,9,11 ],
"links":{
        "featuredmedia":[
        {
          "href": link
        }
           ]
    }
},
...
]

Мой интерфейс:

public interface MediaAPI {
    @GET("Media")
    Call<LinkList> getDetails();
}

Мои классы моделей:

public class LinkList {
    private List<Links> links;
    // getter and setter    
}

...

public class Links {
  private List<Featuredmedia> Featured = new ArrayList<Featuredmedia>();
  // getter and setter 
 }

...

public class Featuredmedia {
    private String href;
    // getter and setter    
}

и клиентский код:

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(ROOT_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    MediaAPI service = retrofit.create(MediaAPI.class);

    Call<LinkList> call = service.getDetails();
    call.enqueue(new Callback<LinkList>() {
        @Override
        public void onResponse(Call<LinkList> call, Response<LinkList> response) {
            if(response.isSuccessful()){                   
                successToast();
            }
            else {                                      
                failToast();
            }
        }

        @Override
        public void onFailure(Call<LinkList> call, Throwable t) {               
            Log.d("Failed", t.getMessage());
            showToast();

        }
    });

Мне нужно только получить ссылку внутри «Featuredmedia», поэтому я включил только те, что указаны в моделях. Я также получил некоторое представление об ошибке из здесь, но ошибка все еще существует.

Любое предложение, как решить эту проблему, будет большим подспорьем.


person Sanzi    schedule 26.04.2016    source источник
comment
Вместо Call ‹LinkList› getDetails () попробуйте Call ‹Links› getDetails ()   -  person Yasir Tahir    schedule 26.04.2016
comment
Чтобы лучше понять JSON, прочтите эту ссылку и проверьте следующие инструменты: форматировщик и редактор, помогите (по крайней мере, мне) проверить и прочитать, что такое Данные, и что они означают ... В основном [...] - это массивы, а {...} - это объекты   -  person Bonatti    schedule 26.04.2016


Ответы (2)


Измените модель Links вот так.

public class Links {
  private List<Featuredmedia> featuredmedia = new ArrayList<Featuredmedia>();
  // getter and setter 
 }

И тоже LinkList должно быть так.

public class LinkList {
    private Links links;
    // getter and setter    
}
person Zahidul Islam    schedule 26.04.2016

Gson позаботится о десериализации json в ваш LinksList и ожидает, что объект будет работать.

Ваша модель в основном ожидает чего-то вроде:

{
   links: [...]
}

Поскольку ваш Response Json представляет собой массив, вы хотите иметь модель, представляющую это: подойдет любой массив или список.

Поэтому вместо использования LinkList просто используйте, например, Call<List<Links>>

person J. Dow    schedule 26.04.2016