如何在对象 Gson/Retrofit2 中获取字符串
Posted
技术标签:
【中文标题】如何在对象 Gson/Retrofit2 中获取字符串【英文标题】:How to get String inside object Gson/Retrofit2 【发布时间】:2019-12-24 21:07:42 【问题描述】:我正在对这个 Google Books API URL做出回应
我有一个改造请求:'
public interface BookApiService
@GET("/books/v1/volumes")
Call<Books> getBooks(@Query("q") String query);
并且有一个实体类
Books.java
public class Books
@SerializedName("items")
@Expose
private List<Book> items;
public List<Book> getItems()
return items;
和Book.java
public class Book
@SerializedName("title")
@Expose
private String mTitle;
public String getTitle()
return mTitle;
请求工作正常,我的意思是连接没有错误,并且改造返回 onResponse,而不是 onFailure。 但我的字符串“标题”为空。我怎么能得到这个。请通过上面的链接检查 JSON 响应。
更新:
改装电话:
public class BookService
private static final String BASE_URL = "https://www.googleapis.com/";
private BookApiService mApiService;
private BookCallback mListener;
public BookService(BookCallback listener)
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build();
mApiService = retrofit.create(BookApiService.class);
mListener = listener;
public void getBooks(String query)
Call<Books> call = mApiService.getBooks(query);
call.enqueue(new Callback<Books>()
@Override
public void onResponse(Call<Books> call, Response<Books> response)
mListener.notifyDataReceived(response.body());
@Override
public void onFailure(Call<Books> call, Throwable t)
mListener.notifyErrorReceived(t);
);
public interface BookCallback
void notifyDataReceived(Books books);
void notifyErrorReceived(Throwable error);
BookCallback 监听器是我的 MainActivity: 当我检查日志时,有
"SUCCESS" "TITLE 1 null"
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
new BookService(this).getBooks("android");
@Override
public void notifyDataReceived(Books books)
if(books.getItems() != null)
List<Book> items = books.getItems();
Log.d(TAG, "Success");
Log.d(TAG, "TITLE 1" + items.get(0).getTitle());
setupAdapter(items);
【问题讨论】:
请在此处发布您的改造电话。 @Kabir 请检查,更新! 请编辑您的问题以包含minimal reproducible example。特别是,你怎么称呼getBooks()
? query
的值是多少?另外,我建议使用 Postman 等工具手动发出请求以查看返回的内容。
试试这个:Log.d(TAG, "TITLE 1" + items.get(0).getVolumeInfo().getTitle());
@Code-Apprentice 正如您在 JSON 响应中看到的那样,有一个我转换为 Books.class
的对象,在此对象内我有一个数组 items
,我将其转换为 List<Book>
,在这个数组里面,有另一个对象volumeInfo
,我需要title
【参考方案1】:
您可以直接在浏览器here 中请求 JSON。仔细查看此数据,您会发现items[0]
没有属性title
。相反,有一个属性volumeInfo
包含title
。您的 Retrofit 实体类需要正确导航到该属性才能获取您需要的数据。
【讨论】:
是的,我知道了,但我该如何解决。我需要将@SerializeName("title")
更改为@SerializeName("volumeInfo/title")
吗?否则它将不起作用。或者我需要创建对象VolumeInfo
,其中包括@Serialized("title")
?
@Rarity7- 我对改造很陌生,所以我不知道确切的细节。您的第二个解决方案很可能会起作用,但需要更多代码用于新类。您的第一个解决方案似乎更理想,因为它是一个较小的变化。由于 javascript 和 JSON 使用.
来引用属性,我会先尝试@SerializeName("volumeInfo.title")
。以上是关于如何在对象 Gson/Retrofit2 中获取字符串的主要内容,如果未能解决你的问题,请参考以下文章