Android 改型不解析数据

Android 改型不解析数据,android,retrofit,Android,Retrofit,我试图通过改造访问Google News API,但我的实现遇到了问题,如果有更有经验的人能看一下我的代码,我会很高兴。问题是查询已成功构建并输入response.issusccessful(),但它没有任何条目 我已确保API正常工作()。另外,通过使用参数构建查询,使用Postman进行测试: 我得到了我的pojo生成与。以下是课程: 新闻条目APIENTRY public class NewsApiEntry { @SerializedName("url") @Expos

我试图通过改造访问Google News API,但我的实现遇到了问题,如果有更有经验的人能看一下我的代码,我会很高兴。问题是查询已成功构建并输入response.issusccessful(),但它没有任何条目

我已确保API正常工作()。另外,通过使用参数构建查询,使用Postman进行测试:

我得到了我的pojo生成与。以下是课程:

新闻条目APIENTRY

public class NewsApiEntry {
    @SerializedName("url")
    @Expose
    private String url;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("contentSnippet")
    @Expose
    private String contentSnippet;
    @SerializedName("link")
    @Expose
    private String link;

    /**
     *
     * @return
     * The url
     */
    public String getUrl() {
        return url;
    }

    /**
     *
     * @param url
     * The url
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     *
     * @return
     * The title
     */
    public String getTitle() {
        return title;
    }

    /**
     *
     * @param title
     * The title
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     *
     * @return
     * The contentSnippet
     */
    public String getContentSnippet() {
        return contentSnippet;
    }

    /**
     *
     * @param contentSnippet
     * The contentSnippet
     */
    public void setContentSnippet(String contentSnippet) {
        this.contentSnippet = contentSnippet;
    }

    /**
     *
     * @return
     * The link
     */
    public String getLink() {
        return link;
    }

    /**
     *
     * @param link
     * The link
     */
    public void setLink(String link) {
        this.link = link;
    }

}
NewsApiResult

public class NewsApiResult {
    @SerializedName("query")
    @Expose
    private String query;
    @SerializedName("entries")
    @Expose
    private List<NewsApiEntry> entries = new ArrayList<NewsApiEntry>();

    /**
     *
     * @return
     * The query
     */
    public String getQuery() {
        return query;
    }

    /**
     *
     * @param query
     * The query
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     *
     * @return
     * The entries
     */
    public List<NewsApiEntry> getEntries() {
        return entries;
    }

    /**
     *
     * @param entries
     * The entries
     */
    public void setEntries(List<NewsApiEntry> entries) {
        this.entries = entries;
    }

}
公共类NewsApiResult{
@SerializedName(“查询”)
@暴露
私有字符串查询;
@SerializedName(“条目”)
@暴露
私有列表项=新的ArrayList();
/**
*
*@返回
*询问
*/
公共字符串getQuery(){
返回查询;
}
/**
*
*@param查询
*询问
*/
公共void setQuery(字符串查询){
this.query=query;
}
/**
*
*@返回
*参赛作品
*/
公共列表getEntries(){
返回条目;
}
/**
*
*@param条目
*参赛作品
*/
公共无效集合项(列表项){
this.entries=条目;
}
}
改装维修发电机

public class NewsApiServiceGenerator {

    public static final String API_BASE_URL = "http://ajax.googleapis.com/ajax/services/feed/";
    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    private static Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();

    private static Retrofit.Builder retroBuilder = new Retrofit.Builder()
            .baseUrl(API_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson));

    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = retroBuilder.client(httpClient.build()).build();
        return retrofit.create(serviceClass);
    }
}
公共类NewsApiServiceGenerator{
公共静态最终字符串API_BASE_URL=”http://ajax.googleapis.com/ajax/services/feed/";
私有静态OkHttpClient.Builder httpClient=new OkHttpClient.Builder();
私有静态Gson Gson=new GsonBuilder()
.setDateFormat(“yyyy-MM-dd'T'HH:MM:ssZ”)
.create();
私有静态改装.Builder retroBuilder=新改装.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson));
公共静态S createService(类serviceClass){
改装改装=retroBuilder.client(httpClient.build()).build();
返回改装。创建(serviceClass);
}
}
最后,主要活动:

public class MainActivity extends AppCompatActivity {
    public static List<NewsApiEntry> newsArticles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        newsArticles= new ArrayList<>();
        fetchNewsArticles("technology");
    }

    private void fetchNewsArticles(String topic) {
        NewsApiClient client = NewsApiServiceGenerator.createService(NewsApiClient.class);

        Call<NewsApiResult> call = client.fetchNews("1.1", topic);
        call.enqueue(new Callback<NewsApiResult>() {
            @Override
            public void onResponse(Call<NewsApiResult> call, Response<NewsApiResult> response) {
                if(response.isSuccessful()) {
                    NewsApiResult res = response.body();
                    Log.d("API REQUEST URL: ", call.request().url().toString());
                    Log.d("API RESPONSE: ", response.raw().toString());
                    Log.d("API ENTRY COUNT: ", Integer.toString(res.getEntries().size()));
                    for(NewsApiEntry newsArticle : res.getEntries()) {
                        Log.d("API NEWS ENTRY TITLE: ", newsArticle.getTitle());
                        newsArticles.add(newsArticle);
                    }
                } else {
                    int statusCode = response.code();
                    ResponseBody errorBody = response.errorBody();
                    Log.e("Network Error: ", errorBody.toString());
                }
            }

            @Override
            public void onFailure(Call<NewsApiResult> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }
}
public类MainActivity扩展了AppCompatActivity{
公共静态列表新闻文章;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
把(这个)绑起来;
newsArticles=newArrayList();
获取新闻文章(“技术”);
}
私有新闻文章(字符串主题){
NewsApiClient=NewsApiServiceGenerator.createService(NewsApiClient.class);
Call Call=client.fetchNews(“1.1”,主题);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
NewsApiResult res=response.body();
Log.d(“API请求URL:,call.REQUEST().URL().toString());
Log.d(“API响应:”,RESPONSE.raw().toString());
Log.d(“API条目计数:”,Integer.toString(res.getEntries().size());
for(NewsApiEntry新闻文章:res.getEntries()){
Log.d(“API新闻条目标题:”,newsArticle.getTitle());
添加(新闻文章);
}
}否则{
int statusCode=response.code();
ResponseBody errorBody=response.errorBody();
Log.e(“网络错误:”,errorBody.toString());
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
t、 printStackTrace();
}
});
}
}
日志如下:

查询构建正确,响应状态为200,但为什么我没有收到充满条目的正文? 注意:我的库已正确加载,项目已成功生成

{“responseData”:{“query”:“technology”,“entries”:[…]}}

查看
NewsApiResult
类如何映射外部对象的
responseData
属性中包含的属性。您还需要使用如下新类映射外部对象:

public class NewsApiResponse {
    @SerializedName("responseData")
    @Expose
    private NewsApiResult responseData;
    ...
}
您的改装电话必须这样声明:

public class NewsApiResponse {
    @SerializedName("responseData")
    @Expose
    private NewsApiResult responseData;
    ...
}
Call Call=client.fetchNews(“1.1”,主题)


这应该可以解决你的问题。

太棒了,可以解决了。看起来我在创建对象时错过了额外的包装器。