Это происходит потому, что тип данных, которые получает Gson, отличается от того, который вы указали. Я призываю вас использовать jsonschema2pojo
. Я поделюсь своим примером для извлечения данных из WordPress, затем я отобразил их в RecyclerView, надеюсь, это поможет.
Вы можете получить хорошее обзор по этой ссылке Модернизация
Класс RetroPost, который содержит поля, которые мне нужны из Wordpress.
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class RetroPost {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("date_gmt")
@Expose
private String dateGmt;
@SerializedName("status")
@Expose
private String status;
@SerializedName("link")
@Expose
private String link;
@SerializedName("title")
@Expose
private RetroPostTitle title;
@SerializedName("content")
@Expose
private RetroPostContent content;
@SerializedName("author")
@Expose
private Integer author;
@SerializedName("comment_status")
@Expose
private String commentStatus;
@SerializedName("categories")
@Expose
private List<Integer> categories = null;
@SerializedName("city")
@Expose
private List<Integer> city = null;
@SerializedName("jetpack_featured_media_url")
@Expose
private String jetpackFeaturedMediaUrl;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDateGmt() {
return dateGmt;
}
public void setDateGmt(String dateGmt) {
this.dateGmt = dateGmt;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public RetroPostTitle getTitle() {
return title;
}
public void setTitle(RetroPostTitle title) {
this.title = title;
}
public RetroPostContent getContent() {
return content;
}
public void setContent(RetroPostContent content) {
this.content = content;
}
public Integer getAuthor() {
return author;
}
public void setAuthor(Integer author) {
this.author = author;
}
public String getCommentStatus() {
return commentStatus;
}
public void setCommentStatus(String commentStatus) {
this.commentStatus = commentStatus;
}
public List<Integer> getCategories() {
return categories;
}
public void setCategories(List<Integer> categories) {
this.categories = categories;
}
public List<Integer> getCity() {
return city;
}
public void setCity(List<Integer> city) {
this.city = city;
}
public String getJetpackFeaturedMediaUrl() {
return jetpackFeaturedMediaUrl;
}
public void setJetpackFeaturedMediaUrl(String jetpackFeaturedMediaUrl) {
this.jetpackFeaturedMediaUrl = jetpackFeaturedMediaUrl;
}
}
Затем классы для объектов (например, заголовок и содержимое) в стороне содержание выше.
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class RetroPostTitle {
@SerializedName("rendered")
@Expose
private String rendered;
public String getRendered() {
return rendered;
}
public void setRendered(String rendered) {
this.rendered = rendered;
}
}
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class RetroPostContent {
@SerializedName("rendered")
@Expose
private String rendered;
@SerializedName("protected")
@Expose
private Boolean _protected;
public String getRendered() {
return rendered;
}
public void setRendered(String rendered) {
this.rendered = rendered;
}
public Boolean getProtected() {
return _protected;
}
public void setProtected(Boolean _protected) {
this._protected = _protected;
}
}
Затем интерфейс
import java.io.File;
import java.util.List;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface WordPressApi {
@GET("/wp-json/wp/v2/posts/")
Call<List<RetroPost>> getPosts(@Query("per_page") String strPerPage);
}
Наконец, способ загрузки данных
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(MyGlobalVars.strURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
WordPressApi wordPressApi = retrofit.create(WordPressApi.class);
postsCall = wordPressApi.getPosts("50");
postsCall.enqueue(new Callback<List<RetroPost>>() {
@Override
public void onResponse(Call<List<RetroPost>> call, Response<List<RetroPost>> response) {
if (!response.isSuccessful()) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage("Something wrong, contact admin")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//do things
}
});
AlertDialog alert = builder.create();
alert.show();
return;
}
ArrayList<HomePostItems> postsList = new ArrayList<>();
List<RetroPost> retroPosts = response.body();
for (RetroPost retroPostItem : retroPosts) {
int intID = retroPostItem.getId();
String strTitle = retroPostItem.getTitle().getRendered();
String strFeaturedImage = retroPostItem.getJetpackFeaturedMediaUrl();
String strDate = retroPostItem.getDateGmt();
String strAuthor = retroPostItem.getAuthor().toString();
String strCity = "102";
String strCategory = "100";
String strLink = retroPostItem.getLink();
postsList.add(new HomePostItems(strFeaturedImage, strTitle, strDate, strCity,
intID, strLink));
}
mRecyclerView = getView().findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getContext());
mAdapter = new HomePostsAdapter(postsList);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
}
@Override
public void onFailure(Call<List<RetroPost>> call, Throwable t) {
}
});