- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一个 newsapi
,其 JSON 响应与此类似;
{
"status": "ok",
"articles": [
{
"source": {
"id": "bbc-news",
"name": "BBC News"
},
"author": "BBC News",
"title": "Jubilation greets end of Mugabe era",
"description": "Zimbabweans celebrate late into the night after Robert Mugabe resigns, ending 37-year rule.",
"url": "http://www.bbc.co.uk/news/world-africa-42072673",
"urlToImage": "https://ichef.bbci.co.uk/images/ic/1024x576/p05nt3bn.jpg",
"publishedAt": "2017-11-22T02:46:09Z"
},
{
"source": {
"id": "bbc-news",
"name": "BBC News"
},
"author": "BBC News",
"title": "Dramatic moment N Korea soldier defects",
"description": "He raced across the border on foot, closely pursued by North Korean troops who shot at him several times.",
"url": "http://www.bbc.co.uk/news/world-asia-42075986",
"urlToImage": "https://ichef.bbci.co.uk/news/1024/cpsprodpb/F519/production/_98854726_p05ntph4.jpg",
"publishedAt": "2017-11-22T04:45:14Z"
},
{
....
}
]
}
我正在尝试使用 Retrofit 2 和 GSON 来使用该响应。
我的 POJO 类是这些;
NewsList.java
public class NewsList {
public Articles[] articles;
private String status;
@Override
public String toString() {
return "ClassPojo [articles = " + articles + ", status = " + status + "]";
}
// getters and setters
}
Articles.java
public class Articles {
private String publishedAt;
private String author;
private String urlToImage;
private String title;
private Source source;
private String description;
private String url;
// getters and setters
}
Source.java
public class Source {
private String id;
private String name;
// getters and setters
}
我的改造客户端看起来像这样;
public interface NewsroomAPI {
String BASE_URL = "https://newsapi.org/v2/";
@GET("top-headlines")
Call<NewsList> loadNews(@Query("sources") String source);
}
在我的 MainActivity.java
中,我像这样调用 Retrofit 客户端;
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().addInterceptor(new Interceptor() {
@Override public okhttp3.Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request.Builder builder = originalRequest.newBuilder().header("Authorization",
getString(R.string.newsroom_api_key));
Request newRequest = builder.build();
return chain.proceed(newRequest);
}
}).build();
Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(NewsroomAPI.BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.client(okHttpClient).build();
NewsroomAPI getNewsAPI = retrofit.create(NewsroomAPI.class);
Call<NewsList> call = getNewsAPI.loadNews("bbc-news");
call.enqueue(new Callback<NewsList>() {
@Override public void onResponse(Call<NewsList> call, Response<NewsList> response) {
if (response.isSuccessful()) {
NewsList newslist = response.body();
Log.w(TAG, "Articles result: " + newslist);
} else {
Toast.makeText(getContext(), "Some error occurred while fetching results!",
Toast.LENGTH_SHORT).show();
}
}
@Override public void onFailure(Call<NewsList> call, Throwable t) {
Log.w(TAG, "Failed! ", t);
}
});
当我运行 Activity 并记录结果时,问题就出现了。我期望包含 status
和返回的 articles
的日志。然而,状态返回成功,但articles
对象为null
。输出如下所示;
W/GlobalNewsFragment: Articles result: ClassPojo [articles = null, status = ok]
问题似乎来自于 Retrofit2
反序列化返回的 JSON 对象的方式。我有什么做错的地方吗?
这些是我的 build.gradle 文件中的依赖项
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile "com.android.support:recyclerview-v7:26.1.0"
compile "com.squareup.okhttp3:okhttp:3.8.0"
最佳答案
您的 POJO 类应如下所示。
public class Article {
@SerializedName("source")
@Expose
private Source source;
@SerializedName("author")
@Expose
private String author;
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
@SerializedName("url")
@Expose
private String url;
@SerializedName("urlToImage")
@Expose
private String urlToImage;
@SerializedName("publishedAt")
@Expose
private String publishedAt;
// your getter setter methods
}
您的 NewsList
POJO 如下所示。
public class NewsList {
@SerializedName("status")
@Expose
private String status;
@SerializedName("articles")
@Expose
private List<Article> articles = null;
// getter setter
}
您的源
POJO 如下所示。
public class Source {
@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;
// getters setters
}
关于java - 如何使用 Retrofit 2 解析嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434338/
我正在尝试迁移我的应用程序以使用 RxJava。我已经在使用 Retrofit,因此我正在尝试使用方法返回 Observables 的 Retrofit 接口(interface)。但是我现在在针对它
我想 post 数据如下: { "user_id":"14545646", "list":["4545645","4545645","4545645","4545645"]
我是改造新手。我向网站发出 POST 请求。网站以 HTML 形式返回响应。所以我会解析它。但是 Retrofit 尝试将其解析为 JSON。怎么办? @FormUrlEncoded @POST("/
我想异步执行 2 个网络调用 - 我正在使用 Retrofit+RxJava 来完成这个。这个逻辑来自一个简单的 Runner 类来测试解决方案。注意:这主要涉及服务器端的 RxJava。 我的代码如
我最近在改造的存储库中使用 Flow。 Result 的密封类 enum class ApiStatus{ SUCCESS, ERROR, LOADING } sealed c
我目前正在开发 Retrofit2 客户端的错误处理部分(使用 Retrofit 的 Rx 实现)。 找了一段时间,没有找到简单的方法将Retrofit返回的ResponseBody反序列化到我报错的
我从 retrofit 更新到 retrofit2 后出现此错误。 FATAL EXCEPTION: OkHttp Dispatcher Process: nz.co.datacom.mars.jun
在使用 RxJava 和 Retrofit 2 时,我正在尝试创建单元测试来覆盖我的应用何时收到特定响应。 我遇到的问题是,在 Retrofit 2 中,我看不到在不使用反射的情况下创建 retrof
在 Retrofit 1.9.x 中有一个 RetrofitError.Kind.NETWORK这让您可以轻松确定故障是否由网络错误引起。在新的 2.0 API 中,我们不再有 RetrofitErr
有没有办法用Refit动态输入参数? 我的 Refit 界面中有这段代码: [Get("/click?{parm}")] Task> SaveClick(string parm
有没有办法用Refit动态输入参数? 我的 Refit 界面中有这段代码: [Get("/click?{parm}")] Task> SaveClick(string parm
我知道,Retrofit 在内部使用 OkHttp。但是,我可以看到一些开发人员提供了以下方法的应用 return new Retrofit.Builder() .baseUrl(Bu
在项目上安装这个库之后: compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.0
在 Retrofit 1.x 中,我使用以下模式创建 API 服务类,该类模拟某些构建变体的不良网络连接。 // Retrofit 1 private T create(Class apiServi
Retrofit请求API格式(Android): @POST("getOrderStatus") @Headers("Content-Type:application/json") Obser
当我实例化 RestAdapter 时,我的应用程序总是崩溃 private void submitForm(SignupForm form){ RestAdapter adapter = n
我正要从 retrofit 1.9 迁移到最新版本并遇到问题... 我的设置: 三星 Galaxy S7 Edge(Android 7) 改造 2.3 OkHttp 3.8 迁移后突然遇到这个问题:
我正在尝试在 2.5.1-SNAPSHOT 中使用 retrofit 的协程支持,但我不断收到一个奇怪的异常。 我的改造服务类有: @GET("weather") suspend fun getFor
我正在尝试 Ktor通过转换一些当前正在使用的现有项目 Retrofit . 虽然我可以很容易地将请求转换为: client.get { url("$BASE_URL/something/so
使用改造 2,如何为上传的文件设置动态名称? 目前是这样的: @Part("avatar\"; filename=\"image\" ") RequestBody image, 但是,上传的文件名将是
我是一名优秀的程序员,十分优秀!